解非线性方程

考虑以下形式的非线性方程:

matlab 代码转为Java代码 matlab代码转成python_matlab

其中matlab 代码转为Java代码 matlab代码转成python_python_02是非线性函数。 问题是找到一个点matlab 代码转为Java代码 matlab代码转成python_matlab 代码转为Java代码_03使得matlab 代码转为Java代码 matlab代码转成python_迭代_04。然后,matlab 代码转为Java代码 matlab代码转成python_matlab 代码转为Java代码_03被称为函数matlab 代码转为Java代码 matlab代码转成python_迭代_06的根。 例如,如果matlab 代码转为Java代码 matlab代码转成python_matlab 代码转为Java代码_07,则matlab 代码转为Java代码 matlab代码转成python_matlab 代码转为Java代码_08的根位于曲线matlab 代码转为Java代码 matlab代码转成python_matlab 代码转为Java代码_09matlab 代码转为Java代码 matlab代码转成python_python_10

在本中,将讨论四种求解给定非线性方程的方法,即二分法,牛顿-拉夫森法,割线和迭代法,并在MATLAB和Python中实现。

二等分法

假设函数matlab 代码转为Java代码 matlab代码转成python_迭代_11 在间隔matlab 代码转为Java代码 matlab代码转成python_matlab_12

二等分方法是一种迭代方法,该方法在每次迭代中将包含根的间隔分为两个相等的子间隔,将不包含根的一半除去,然后在另一半中寻找根。

如果间隔matlab 代码转为Java代码 matlab代码转成python_matlab_12 分为两个相等的子间隔matlab 代码转为Java代码 matlab代码转成python_迭代_14matlab 代码转为Java代码 matlab代码转成python_python_15 ,其中matlab 代码转为Java代码 matlab代码转成python_matlab_16是间隔matlab 代码转为Java代码 matlab代码转成python_matlab_12 的中点。函数matlab 代码转为Java代码 matlab代码转成python_迭代_06的根在matlab 代码转为Java代码 matlab代码转成python_迭代_14matlab 代码转为Java代码 matlab代码转成python_python_15 中。 如果它位于matlab 代码转为Java代码 matlab代码转成python_迭代_14 中,则matlab 代码转为Java代码 matlab代码转成python_matlab 代码转为Java代码_22。在这种情况下,我们知道根不在matlab 代码转为Java代码 matlab代码转成python_迭代_14 区间内,因此我们在matlab 代码转为Java代码 matlab代码转成python_python_15

实现二分法的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 代码转为Java代码 matlab代码转成python_迭代_11 在点matlab 代码转为Java代码 matlab代码转成python_二分法_26附近是连续的,则可以用以下形式编写:

matlab 代码转为Java代码 matlab代码转成python_matlab_27

现在,如果matlab 代码转为Java代码 matlab代码转成python_python_28是函数matlab 代码转为Java代码 matlab代码转成python_迭代_11 的根,则matlab 代码转为Java代码 matlab代码转成python_迭代_30。即:

matlab 代码转为Java代码 matlab代码转成python_python_31

根据以上公式:

matlab 代码转为Java代码 matlab代码转成python_迭代_32

假设matlab 代码转为Java代码 matlab代码转成python_python_33

牛顿-拉夫森法是一种迭代方法,用于找到最接近函数matlab 代码转为Java代码 matlab代码转成python_迭代_11 到初始猜测值matlab 代码转为Java代码 matlab代码转成python_二分法_35的近似值。 从matlab 代码转为Java代码 matlab代码转成python_二分法_35开始,它会生成一个数字序列matlab 代码转为Java代码 matlab代码转成python_python_37其中,

matlab 代码转为Java代码 matlab代码转成python_二分法_38

这个数字序列收敛到matlab 代码转为Java代码 matlab代码转成python_迭代_06的最接近matlab 代码转为Java代码 matlab代码转成python_二分法_26的根。

要使用牛顿-拉夫森方法为函数matlab 代码转为Java代码 matlab代码转成python_matlab 代码转为Java代码_41求根,请注意matlab 代码转为Java代码 matlab代码转成python_matlab_42,因此,迭代方法的形式为:

matlab 代码转为Java代码 matlab代码转成python_二分法_43

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的代码为:

一次运行上述代码matlab 代码转为Java代码 matlab代码转成python_matlab 代码转为Java代码_44,另一次运行matlab 代码转为Java代码 matlab代码转成python_matlab 代码转为Java代码_45

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 代码转为Java代码 matlab代码转成python_二分法_46matlab 代码转为Java代码 matlab代码转成python_迭代_11 的导数。 它将matlab 代码转为Java代码 matlab代码转成python_迭代_48

matlab 代码转为Java代码 matlab代码转成python_matlab_49

因此,割线方法的形式为:

matlab 代码转为Java代码 matlab代码转成python_二分法_50

从某个包含matlab 代码转为Java代码 matlab代码转成python_迭代_11 根的间隔matlab 代码转为Java代码 matlab代码转成python_matlab_12 开始,割线方法迭代逼近matlab 代码转为Java代码 matlab代码转成python_matlab_12matlab 代码转为Java代码 matlab代码转成python_迭代_11

MATLAB函数Secant实现割线方法。 它接收一个函数matlab 代码转为Java代码 matlab代码转成python_迭代_06,其间隔matlab 代码转为Java代码 matlab代码转成python_matlab_12 的界限包含matlab 代码转为Java代码 matlab代码转成python_迭代_06的根,并且公差matlab 代码转为Java代码 matlab代码转成python_迭代_58。它应用割线方法返回近似解matlab 代码转为Java代码 matlab代码转成python_python_59和迭代次数。

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函数以找到matlab 代码转为Java代码 matlab代码转成python_python_60的近似根,如下所示。

>> 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代码如下。

为了找到等式matlab 代码转为Java代码 matlab代码转成python_python_60的根,使用了以下Python指令:

固定点的迭代方法

matlab 代码转为Java代码 matlab代码转成python_matlab_62是函数matlab 代码转为Java代码 matlab代码转成python_matlab 代码转为Java代码_63

matlab 代码转为Java代码 matlab代码转成python_迭代_64

假设函数matlab 代码转为Java代码 matlab代码转成python_迭代_11

matlab 代码转为Java代码 matlab代码转成python_二分法_66

如果matlab 代码转为Java代码 matlab代码转成python_python_67matlab 代码转为Java代码 matlab代码转成python_迭代_11

matlab 代码转为Java代码 matlab代码转成python_python_69

这意味着matlab 代码转为Java代码 matlab代码转成python_python_67是函数matlab 代码转为Java代码 matlab代码转成python_matlab 代码转为Java代码_63 的不动点。 朝固定点进行迭代的方法的思想是将函数matlab 代码转为Java代码 matlab代码转成python_迭代_11 编写为matlab 代码转为Java代码 matlab代码转成python_matlab 代码转为Java代码_73的形状,并从一些初始猜测matlab 代码转为Java代码 matlab代码转成python_二分法_35开始,该方法生成数字matlab 代码转为Java代码 matlab代码转成python_matlab 代码转为Java代码_75 的序列,使用迭代规则收敛到函数matlab 代码转为Java代码 matlab代码转成python_matlab 代码转为Java代码_63

matlab 代码转为Java代码 matlab代码转成python_二分法_77

为了说明迭代方法的工作原理,将使用它来找到函数的根

matlab 代码转为Java代码 matlab代码转成python_二分法_78

首先,函数matlab 代码转为Java代码 matlab代码转成python_迭代_79matlab 代码转为Java代码 matlab代码转成python_matlab 代码转为Java代码_73的形式编写。 一种可能的选择是编写:

matlab 代码转为Java代码 matlab代码转成python_二分法_81

如果matlab 代码转为Java代码 matlab代码转成python_matlab_62matlab 代码转为Java代码 matlab代码转成python_迭代_11

matlab 代码转为Java代码 matlab代码转成python_迭代_84

从中得出,

matlab 代码转为Java代码 matlab代码转成python_matlab 代码转为Java代码_85

从初始点matlab 代码转为Java代码 matlab代码转成python_二分法_35开始,为matlab 代码转为Java代码 matlab代码转成python_迭代_11

使用MATLAB和Python solve函数

使用非线性方程组