解非线性方程
考虑以下形式的非线性方程:
其中是非线性函数。 问题是找到一个点使得。然后,被称为函数的根。 例如,如果,则的根位于曲线与
在本中,将讨论四种求解给定非线性方程的方法,即二分法,牛顿-拉夫森法,割线和迭代法,并在MATLAB和Python中实现。
二等分法
假设函数 在间隔
二等分方法是一种迭代方法,该方法在每次迭代中将包含根的间隔分为两个相等的子间隔,将不包含根的一半除去,然后在另一半中寻找根。
如果间隔 分为两个相等的子间隔 和 ,其中是间隔 的中点。函数的根在 或 中。 如果它位于 中,则。在这种情况下,我们知道根不在 区间内,因此我们在
实现二分法的MATLAB代码部分如下,
function x = Bisection(f, a, b, Epsilon)
while b-a ≥ Epsilon
c = (a+b)/2 ;
if f(a)*f(c) < 0
b = c ;
elseif f(b)*f(c) < 0
a = c ;
else
x = c ;
end
end
x=c ;
现在,我们可以从命令提示符处调用函数二分法,
>> format long
>> Epsilon = 1e-8 ;
>> f = @(x) xˆ2 - 3 ;
>> r = Bisection(f, 1, 2, Epsilon)
r =
1.732050813734531
>> s = Bisection(f, -2, -1, Epsilon)
s =
-1
实现二分法的Python代码部分如下,
In [1]: f = lambda x: x**2 - 3
In [2]: a, b = 1., 2.
In [3]: Eps = 1e-8
In [4]: x, Iters = Bisection(f, a, b, Eps)
In [5]: print(’Approximate root is:’, x, ’\nIterations:’, Iters)
Approximate root is: 1.7320508062839508
Iterations: 25
牛顿-拉普森法
如果函数 在点附近是连续的,则可以用以下形式编写:
现在,如果是函数 的根,则。即:
根据以上公式:
假设。
牛顿-拉夫森法是一种迭代方法,用于找到最接近函数 到初始猜测值的近似值。 从开始,它会生成一个数字序列其中,
这个数字序列收敛到的最接近的根。
要使用牛顿-拉夫森方法为函数求根,请注意,因此,迭代方法的形式为:
MATLAB函数NewtonRaphson.m实现了NewtonRaphson方法:
function [x, Iter] = NewtonRaphson(f, fp, x0, Epsilon)
Iter = 0 ;
x1 = x0 - f(x0)/fp(x0) ;
while abs(f(x1)) ≥ Epsilon
x0 = x1 ;
x1 = x0 - f(x0)/fp(x0) ;
Iter = Iter + 1 ;
end
x = x1 ;
从命令提示符处调用NewtonRaphson函数:
>> format long
>> f = @(x) xˆ2 - 3 ;
>> fp = @(x) 2*x ;
>> Epsilon = 1e-8 ;
>> x0 = 1 ;
>>[x, Iterations] = NewtonRaphson(f, fp, x0, Epsilon)
x =
1.732050810014728
Iterations =
3
>> [x, Iterations] = NewtonRaphson(f, fp, -x0, Epsilon)
x =
-1.732050810014728
Iterations =
3
Python函数NewtonRaphson的代码为:
一次运行上述代码,另一次运行:
In [6]: x, Iters = NewtonRaphson(f, fp, x0, Eps)
In [7]: print(’Approximate root is:’, x, ’\nIterations:’, Iters)
Approximate root is: 1.7320508100147276
Iterations: 4
In [8]: x, Iters = NewtonRaphson(f, fp, -x0, Eps)
In [9]: print(’Approximate root is:’, x, ’\nIterations:’, Iters)
Approximate root is: -1.7320508100147276
Iterations: 4
割线法
割线法与牛顿-拉夫森法具有近似的形式,但是它不需要解析形式为 的 的导数。 它将
因此,割线方法的形式为:
从某个包含 根的间隔 开始,割线方法迭代逼近 中
MATLAB函数Secant实现割线方法。 它接收一个函数,其间隔 的界限包含的根,并且公差。它应用割线方法返回近似解和迭代次数。
function [x, Iterations] = Secant(f, a, b, Eps)
x = b - ((b-a)*f(b))/(f(b)-f(a)) ;
Iterations = 1 ;
while fabs(f(x)) ≥ Eps
a = b ;
b = x ;
x = b - ((b-a)*f(b))/(f(b)-f(a)) ;
Iterations = Iterations + 1 ;
end
调用MATLAB函数以找到的近似根,如下所示。
>> f = @(x) xˆ2-3 ;
>> a = 1; b = 2 ;
>> Eps = 1e-8 ;
>> [x, Iterations] = Secant(f, a, b, Eps)
x =
1.732050807565499
Iterations =
5
函数Secant的Python代码如下。
为了找到等式的根,使用了以下Python指令:
固定点的迭代方法
点是函数
假设函数
如果是
这意味着是函数 的不动点。 朝固定点进行迭代的方法的思想是将函数 编写为的形状,并从一些初始猜测开始,该方法生成数字 的序列,使用迭代规则收敛到函数
为了说明迭代方法的工作原理,将使用它来找到函数的根
首先,函数以的形式编写。 一种可能的选择是编写:
如果是
从中得出,
从初始点开始,为
使用MATLAB和Python solve函数
使用非线性方程组