Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
0% found this document useful (0 votes)
309 views

Numerical Methods For Solutions of Equations in Python

Symbolic calculus in Python Norms in Python Numerical methods to find zeros of a real-valued function: a. Bisection method b. Newton method c. Secant method d. Chord method e. Contraction method for fixed points.

Uploaded by

theodor_munteanu
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
309 views

Numerical Methods For Solutions of Equations in Python

Symbolic calculus in Python Norms in Python Numerical methods to find zeros of a real-valued function: a. Bisection method b. Newton method c. Secant method d. Chord method e. Contraction method for fixed points.

Uploaded by

theodor_munteanu
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 9

Numerical methods to find solutions of equations

Contents
Introduction .................................................................................................................................................. 1
Norms: Vectors and matrices.................................................................................................................... 1
Code in Python ...................................................................................................................................... 2
Symbolic calculus ...................................................................................................................................... 3
Numerical methods for non-linear equations in R...................................................................................... 4
Bisection method ...................................................................................................................................... 4
Methodology......................................................................................................................................... 4
Python code .......................................................................................................................................... 4
Contraction method.................................................................................................................................. 5
Methodology......................................................................................................................................... 5
Python code .......................................................................................................................................... 6
Other Methods: Newton, secant, chord ................................................................................................... 6
Methodology......................................................................................................................................... 6
Python code .......................................................................................................................................... 7
Numerical methods for non-linear equations in 𝑹𝒏 .................................................................................. 8
Contraction principle ................................................................................................................................ 8

Introduction
Norms: Vectors and matrices
Definition:
1
For 𝑥 = (𝑥1 , 𝑥2 , … , 𝑥𝑑 ) ∈ 𝑅 𝑑 , 𝑝 ∈ 𝑅+ , 𝑝 < ∞, ||𝑥||𝑝 = (|𝑥1 |𝑝 + |𝑥2 |𝑝 + ⋯ + |𝑥𝑑 |𝑝 )𝑝 .

If 𝑝 = ∞, ||𝑥||𝑝 = max(|𝑥1 |, … , |𝑥𝑑 |).

Definition 2:

If 𝐴 ∈ 𝑀𝑚,𝑛 (𝐶), ||𝐴||𝛼𝛽 = sup ||𝐴𝑥||𝛽 . If 𝛼 = 𝛽, ||𝐴||𝛼𝛼 = ||𝐴||𝛼 .


||𝑥||𝛼 ≤1

Example: ||𝐴||1 = max ∑𝑚 𝑛


𝑖=1|𝑎𝑖𝑗 |; ||𝐴||∞ = max ∑𝑗=1 |𝑎𝑖𝑗 |.
1≤𝑗≤𝑛 1≤𝑖≤𝑚

2
Frobenius norm: ||𝐴||𝐹 = √∑𝑚 𝑛
𝑖=1 ∑𝑗=1|𝑎𝑖𝑗 |

Properties:
||𝑨||𝟐 = √𝝆(𝑨𝒕 𝑨) where 𝝆(𝑿) = spectral radius of 𝑿 ∈ 𝑴𝒎 (𝑪): = 𝒎𝒂𝒙{|𝝀𝟏 |, … , |𝝀𝒎 |}

Code in Python
import numpy as np
def test_norms():
def test1():
"I will test norm1 of vector: the sum of absolute values of elems"
v = np.array([1,2,3,4])
v2 = np.array([1,-2,3,-4])
print("You are inside test1")
print("Norm-1 of v is:",np.linalg.norm(v,1))
print("Norm-1 of v2 is:",np.linalg.norm(v2,1))
test1()
def test2():
v = np.array([1,2,3,4])
print("Inside test 2")
print("Usual norm of v is",np.linalg.norm(v))
print("2-norm of V is",np.linalg.norm(v,2))
print("Infinity norm of V is",np.linalg.norm(v,np.inf))
print("As an alternative, the same norm of V is",np.max(np.abs(v)))
"by default the norm computed is the norm-2"
def test3():
v = np.array([[1,2,3,4],[-1,2,3,3]])
print("Inside test 3:")
print("Norm 2 of the matrix v is:",np.linalg.norm(v))
def test4():
v = np.array([[1,2,3,4],[-1,2,3,3]])
print("The inf norm of matrix v is:",np.linalg.norm(v,np.inf))
res1,res2 = np.sum(np.abs(v[0])),np.sum(np.abs(v[1]))
print("Alternatively, norm inf of matrix v is",np.max([res1,res2]))
test2()
test3()
test4()

Exercise1 :

a. Implement your own functions for norms (p and ∞).(At least for vectors).

b. Verify in Python the property ||𝐴||2 = √𝜌(𝐴𝑡 𝐴) .

Solution :

a.

import numpy as np
def norms(num):
def norm1(v):
"v is a vector"
return np.sum(np.abs(v))
def norm2(v):
"v is also vector"
return np.sqrt(np.sum(v**2))
def test():
v = np.array([3,4,5])
print(norm2(v))
def norm(v,p):
return (np.sum(v**p))**(1/p)
def test2():
v = np.array([3,4,5])
print(norm(v,2))
dic = {1:norm1,2:norm2,3:norm}
return dic[num]
You can add test1() and test2() calls inside norms library to witness the functionality of the defined
functions.

b.

def exercise():
def spectral_radius(A):
eig = np.linalg.eig(A)[0]
return np.max(np.abs(eig))
def quantity(A):
"the RHS of the equality"
X = np.dot(np.transpose(A),A)
return np.sqrt(spectral_radius(X))
def test():
v = np.array([[1,2,3,4],[-1,2,3,3]])
print("Norm 2 of the matrix v is:",np.linalg.norm(v,2))
print("The RHS quantity is:",quantity(v))
test()

Symbolic calculus
Sympy is a library defined to handle symbolic calculus.

This library has various features for limits, differentiation, integration, etc.

import sympy as sym


import numpy as np
def test_symbols():
def test1():
x = sym.Symbol('x')
print(sym.diff(sym.sin(x),x))
test1()
def test2():
h = lambda x: sym.sin(x)
print('The sine function in pi/2',h(np.pi/2))
h2 = lambda x: sym.diff(h(x))
print('The derivative of sine in pi/2=',h2(np.pi/2))
test2()
def test3():
x = sym.Symbol('x')
y = x**2+1
yprime = y.diff(x)
print(yprime)
test3()
def test4():
x = sym.Symbol('x')
y = x**2+1
yprime = y.diff(x)
f = sym.lambdify(x,yprime,'numpy')
print(f(np.array([1,2,3,4,5])))
test4()

Numerical methods for non-linear equations in R


Bisection method
Methodology
Let 𝑎 < 𝑏 ∈ 𝑅 and 𝑓: [𝑎, 𝑏] → 𝑅 a continuous function with 𝑓(𝑎) ⋅ 𝑓(𝑏) < 0. Then ∃𝑧 ∈ [𝑎, 𝑏] such that
𝑓(𝑧) = 0.
We define (𝑎𝑛 )𝑛≥0 , (𝑏𝑛 )𝑛≥0 , (𝑐𝑛 )𝑛≥0 such that :
𝑎+𝑏
• 𝑎0 = 𝑎, 𝑏0 = 𝑏, 𝑐0 = ;
2
• For 𝑛 ≥ 1
𝑎𝑛 = 𝑎𝑛−1
o If 𝑓(𝑐𝑛−1 ) = 0 then { 𝑏𝑛 = 𝑏𝑛−1
𝑐𝑛 = 𝑐𝑛−1
𝑎𝑛 = 𝑎𝑛−1
o If 𝑓(𝑎𝑛−1 )𝑓(𝑐𝑛−1 ) < 0 then { 𝑏𝑛 = 𝑐𝑛−1
𝑐𝑛 = (𝑎𝑛 + 𝑏𝑛 )/2
𝑎𝑛 = 𝑐𝑛−1
o If 𝑓(𝑎𝑛−1 )𝑓(𝑐𝑛−1 ) > 0 then { 𝑏𝑛 = 𝑏𝑛−1 .
𝑐𝑛 = (𝑎𝑛 + 𝑏𝑛 )/2

Suppose that f has a unique root in [𝑎, 𝑏].

Then the sequence (𝑐𝑛 )𝑛≥0 built above converges to the unique solution 𝑧 ∈ [𝑎, 𝑏] of equation 𝑓(𝑥) =
𝑏−𝑎
0 and |𝑐𝑛 − 𝑧| ≤ 2𝑛
.

Python code
import numpy as np
def bisection_method():
def condition(f,a,b):
"We test if f(a)f(b)<0"
if f(a)*f(b)>=0:
return 0
else:
return 1
def bisect(f,a,b,tol):
if condition(f,a,b)==0:
raise Exception("Choose another pair of endpoints")
else:
x,y,z = a,b,(a+b)/2
err,n = 1,1
while err>=tol and n<30:
if f(z) == 0:
return z,err,n
elif f(x)*f(z)<0:
x=x
y=z
z = (x+y)/2
err = np.abs(z-x)
n = n+1
elif f(x)*f(z)>0:
x=z
z = (x+y)/2
err = np.abs(z-x)
n = n+1
return z,err,n
def test1():
f = lambda x: np.exp(x)-x-2
a,b = 1,2
res = bisect(f,a,b,0.00001)[0]
print(f(res))
print(bisect(f,a,b,0.00001))
test1()

Contraction method
Methodology
Let 𝐼 ⊂ 𝑅 an interval and 𝑓: 𝐼 → 𝑅 a function. The function 𝑓 is called contraction if and only if :

a) ∃𝑞 ∈ (0,1) such that |𝑓(𝑥) − 𝑓(𝑦)| ≤ 𝑞|𝑥 − 𝑦|, ∀𝑥, 𝑦 ∈ 𝐼 ;

𝑏) 𝑓(𝐼) ⊂ 𝐼.

If 𝑓: [𝑎, 𝑏] → 𝑅 is differentiable and :

a) If ∃𝑞 ∈ (0,1) such that |𝑓 ′ (𝑥)| ≤ 𝑞 for which 𝑥 ∈ [𝑎, 𝑏] ⇒ |𝑓(𝑥) − 𝑓(𝑦)| ≤ 𝑞|𝑥 − 𝑦|, ∀𝑥, 𝑦 ∈ [𝑎, 𝑏].
𝑎+𝑏 𝑎+𝑏 𝑏−𝑎
b) If |𝑓(𝑥) − 𝑓(𝑦)| ≤ 𝑞|𝑥 − 𝑦|and |𝑓 ( 2
)− 2 | ≤ (1 − 𝑞) ⋅ 2
then 𝑓([𝑎, 𝑏]) ⊂ [𝑎, 𝑏].

Main statement :
Let 𝒇: 𝑰 → 𝑹 be a contraction and 𝑥0 ∈ 𝐼. We define the sequence (𝑥𝑛 )𝑛 through the relation 𝑥𝑛+1 =
𝑓(𝑥𝑛 ), ∀𝑛 ∈ 𝑁. Then the equation 𝑓(𝑥) = 𝑥 has a unique solution 𝑧 ∈ [𝑎, 𝑏] and the sequence 𝑥𝑛 → 𝑧,
with the following error evaluation formula :
𝑞 𝑞𝑛
|𝑥𝑛 − 𝑧| ≤ |𝑥𝑛 − 𝑥𝑛−1 | ≤ |𝑥 − 𝑥0 |, ∀𝑛 ∈ 𝑁.
1−𝑞 1−𝑞 1

Python code
import numpy as np
def contraction(f,x0,tol):
"this is for functions f:R->R"
err,n = 1,0
x = x0
while err>=tol and n<30:
y = f(x)
err = np.abs(x-y)
n = n+1
x=y
return x,err,n

def test():
f = lambda x:x**2+x-7/16
x0 = -5/8
tol = 0.00001
print(contraction(f,x0,tol))
res = contraction(f,x0,tol)[0]
print(f(res))
#res will be a fixed point for f, f(res)=res

Other Methods: Newton, secant, chord


Methodology
1. Chord method

Conditions: Let [𝑎, 𝑏] ⊂ 𝑅, 𝑓: [𝑎, 𝑏] → 𝑅. Suppose the next conditions are met:

a. 𝑓 ′′ (𝑥) ≠ 0, ∀𝑥 ∈ [𝑎, 𝑏];


b. 𝑓(𝑎)𝑓 ′′ (𝑎) > 0;
c. 𝑓(𝑎) ⋅ 𝑓(𝑏) < 0.
𝑥0 𝑓(𝑥𝑛 )−𝑥𝑛 𝑓(𝑥0 )
Then the sequence 𝑥0 = 𝑎, 𝑥1 = 𝑏, 𝑥𝑛+1 = converges to the unique solution of
𝑓(𝑥𝑛 )−𝑓(𝑥0 )
𝑓(𝑥) = 0.
2. Secant method

Conditions: Let [𝑎, 𝑏] ⊂ 𝑅, 𝑓: [𝑎, 𝑏] → 𝑅. Suppose the following statements hold:

a. 𝑓 ′ (𝑥) ≠ 0, ∀𝑥 ∈ [𝑎, 𝑏].


b. (𝑥𝑛 ) ⊂ [𝑎, 𝑏].
c. 𝑓(𝑎) ⋅ 𝑓(𝑏) < 0.
𝑥𝑛−1 𝑓(𝑥𝑛 )−𝑥𝑛 𝑓(𝑥𝑛−1 )
Then the sequence 𝑥0 , 𝑥1 ∈ [𝑎, 𝑏], 𝑥𝑛+1 = 𝑓(𝑥𝑛 )−𝑓(𝑥𝑛−1 )
converges to the unique solution
of 𝑓(𝑥) = 0.
3. Newton method
Conditions: Let the following conditions considered as satisfied:
a. 𝑓 ′ , 𝑓 ′′ ≠ 0 𝑜𝑛 [𝑎, 𝑏]
b. 𝑓(𝑎)𝑓(𝑏) < 0
c. Let 𝑥0 ∈ [𝑎, 𝑏] such that 𝑓(𝑥0 )𝑓 ′′ (𝑥0 ) > 0.
𝑓(𝑥 )
Then the sequence 𝑥𝑛+1 = 𝑥𝑛 − 𝑓′ (𝑥𝑛 ) , ∀𝑛 ∈ 𝑁 converges to the unique solution 𝑧 of
𝑛
𝑓(𝑥) = 0.
The error is defined by the following inequality:
|𝑥𝑛 − 𝑧| ≤ |𝑓(𝑥𝑛 )|/( min |𝑓 ′ (𝑥)|) .
𝑥∈[𝑎,𝑏]

Remarks:

1. Secant method requires less information about the function, 𝑓 must be only one time differentiable
(compared to two times in Newton or chord), but the number of operations involved is bigger,
because at step 𝑛 + 1 it depends on the solutions found at steps 𝑛& 𝑛 − 1.
2. Newton method requires the biggest number of conditions to be fulfilled but is the fastest method.

Python code
import numpy as np
def num_method(num):
def chord(f,a,b,no_iter):
if f(a)*f(b)<0:
x,y=a,b
for i in range(no_iter):
x,y = y,(a*f(x)-x*f(a))/(f(x)-f(a))
return y
else:
return "Choose another pair of endpoints"

def secant(f,x0,x1,no_iter):
if f(x0)*f(x1)<0:
x,y = x0,x1
for i in range(no_iter):
x,y = y,(x*f(y)-y*f(x))/(f(y)-f(x))
return y
else:
return "Choose another pair of values for x0 and x1"
def Newton(f,fprime,x0,no_iter):
x = x0
for i in range(no_iter):
x = x-f(x)/fprime(x)
return x
dic = {1:chord,2:secant,3:Newton}
return dic[num]

def tests():
def test_chord():
g=num_method(1)
h = lambda x:np.exp(x)-x-2
print(g(h,0,2,20))
def test_secant():
h = lambda x:np.exp(x)-x-2
g = num_method(2)
print(g(h,0,4,50))
def test_Newton():
h1 = lambda x:np.exp(x)-x-2
h1_prime = lambda x:np.exp(x)-1
g = num_method(3)
#print(g(h1,h1_prime,0,10))
print(g(h1,h1_prime,1,10))
def test_Newton2():
import scipy.optimize as scp
h1 = lambda x:np.exp(x)-x-2
h1_prime = lambda x:np.exp(x)-1
print(scp.newton(h1,1,h1_prime)) #uses Newton method
print(scp.newton(h1,1))
test_Newton()
test_Newton2()

Numerical methods for non-linear equations in 𝑹𝒏


Contraction principle
Let 𝑚 ∈ 𝑁 ∗ , 𝑀 ⊂ 𝑅 𝑚 and || ⋅ || a norm on 𝑅 𝑚 . A function 𝑓: 𝑀 → 𝑅 𝑚 is called 𝑞 −contraction of the set
M, with respect to the norm || ⋅ || if:

a) ∃𝑞 ∈ (0,1) such that ||𝑓(𝑥) − 𝑓(𝑦)|| ≤ 𝑞||𝑥 − 𝑦||, ∀𝑥, 𝑦 ∈ 𝑀 and

𝑏) 𝑓(𝑀) ⊂ 𝑀.

Statement:

Let be || ⋅ || a norm on 𝑅 𝑚 ,M a closed set in 𝑅 𝑚 ,𝑓: 𝑀 → 𝑅 𝑚 a q-contraction of M. Then the equation


𝑓(𝑥) = 𝑥 has a unique solution 𝑧 ∈ 𝑀 and for every 𝑥0 ∈ 𝑀, the sequence defined through the relation
𝑥 (𝑛+1) = 𝑓(𝑥 (𝑛) ) → 𝑧. We have the evaluation:
𝑞 𝑞𝑛
||𝑥 (𝑛) − 𝑧|| ≤ 1−𝑞 ||𝑥 (𝑛) − 𝑥 (𝑛−1) || ≤ 1−𝑞 ||𝑥 (1) − 𝑥 (0) ||.

Exercise:
80+𝑥 3 −𝑥 2 −3𝑦𝑧
𝑥= 100
60−𝑦 3 −𝑧 2 +4𝑦𝑧
Solve the following system: 𝑦 = on the set 𝑉 = [0,2]3 , starting from 𝑥 (0) = (1,1,1).
86
40+𝑧 3 +𝑦 2 −5𝑥𝑦
{𝑧 = 72
Python code:

def function():
F = lambda x: np.array([(80+x[0]**3-x[0]**2-3*x[1]*x[2])/100,\
(60-x[1]**3-x[2]**2+4*x[0]*x[2])/86,\
(40+x[2]**3+x[1]**2-5*x[0]*x[1])/72])
return F

def fixed_point_function(x0,tol):
'I will compute the fixed point on [0,2]x[0,2]x[0,2] starting from the '
'point x0'
x,err,n = x0,1,1
F = function()
while err>=tol and n<30:
z = F(x)
err = np.linalg.norm(z-x,np.inf)
n = n+1
x=z
return x,err,n

def test_fixed_point_function():
x0 = np.array([1,1,1])
tol = np.exp(-5)
print(fixed_point_function(x0,tol))

Exercise 2:

For the previous system show at each iteration up to the 10th the solution 𝑥 (𝑛) .

Solution:
def fixed_point_function2(x0):
x,n=x0,1
F=function()
while n<=10:
z=F(x)
err = np.linalg.norm(z-x,np.inf)
n = n+1
x = z
print(x,err)

def test_fixed_point_function2():
x0=np.array([1,1,1])
fixed_point_function2(x0)

You might also like