非线性方程求根.
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.2 二分法求解非线性方程的优缺点: 计算过程简单,收敛性可保证; • 对函数的性质要求低,只要连续即可。 缺点: • 收敛速度慢; • 不能求复根和重根; • 调用一次求解一个[a,b]间的多个根无法求 得。
•
输入
a, b, 1 , 2 , N 0 , f max
h (b a ) / 2
lim xk x *
k
则称迭代过程收敛,且x*=(x*)为(x)的不动点。
y=x
几何意义:
y ( x)
x ( x)
y x y ( x)
x2 x1 x0
但迭代法并不总令人满意,如将前述方程x3-x-1=0改写 为另一等价形式: 3
x x 1
3 k
第八讲
非线性方程求根
内容提要
引言 二分法 迭代法 Newton迭代法 MATLAB的非线性方程求根函数 小结
1、引言
在工程和科学技术中许多问题常常归结为求解非线性方程式问 题,例如在控制系统的设计领域,研究人口增长率等。 例 关于真实气体的状态方程(Van der waals方程)为
x 3 x 1
x1≠x0,再将x1代入得
x1 3 x0 1 3 1.5 1 1.35721
x2≠x1,再将x2代入得
x2 3 x1 1 3 1.35721 1 1.33086
x3 3 x2 1 3 1.330861 1.32588
如此下去,这种逐步校正的过程称为迭代过程。这里用的 公式称为迭代公式,即 k=0,1,2,…… 迭代结果见下表。仅取六位数字,x7与x8相同,即认为x8 是方程的根。 xk xk x*≈x8=1.32472 k k 0 1.5 5 1.32476 1 1.35721 6 1.32473 2 1.33086 7 1.32472 3 1.32588 8 1.32472 4 1.32494
f ( x) 1
或 h 2 否 是
k 1,2, N 0
计算
输出
k , x, f ( x )
stop
xk x (b a ) / 2
f ( x) f max
否
是
输出 : “function approaching infinity for x=”;x
f (a) f ( x) 0
例:用二分法求方程x^3-3x+1=0在区间[0,1]上的一个根。
3、迭代法
3.1 基本思想 迭代法是一种逐次逼近的方法,用某个固定公 式反复校正根的近似值,使之逐步精确化,最 后得到满足精度要求的结果。
例:求方程 x3-x-1=0 在 x=1.5 附近的一个根。
将所给方程改写成 假设初值x0=1.5是其根,代入得
以[a1, b1]为新的隔根区间,且仅为[a,b]的一半,对[a1, b1]重复前过程,得新的隔根区间[a2, b2],如此二分下去,得 一系列隔根区间: [a,b] [a1, b1] [a2, b2] …… [ak, bk] …… 其中每个区间都是前一区间的一半,故[ak, bk] 的长度:
x0
y ( x)
发散
y ( x)
O
x2
x1
x0 x *
O
x3 x1 x * x0 x2
( x)在x * 附近较陡峭
程序设计
function [root,n]=StablePoint(f,x0,eps) if(nargin==2) eps=1.0e-4;
end
tol=1; root=x0; n=0; while(tol>eps) n=n+1; r1=root; root=subs(sym(f),findsym(sym(f)),r1)+r1; tol=abs(root-r1); end
非线性方程的一般形式: f(x)=0
• 代数方程: f(x)=a0+a1x+……+anxn (an0) • 超越方程 :f(x)中含三角函数、指数函数、或其他超 越函数。
用数值方法求解非线性方程的步骤:
• (1)找出有根区间;(只含一个实根的区间称隔根 区间) • (2)近似根的精确化。从隔根区间内的一个或多个 点出发,逐次逼近,寻求满足精度的根的近似值。
否
是
bx
ax
k N0
否
输出
分半 N 0次还没有到 达精度要求信息
2.3 MATLAB实现
function root=HalfInterval(f,a,b,eps) if(nargin==3) eps=1.0e-4; end f1=subs(sym(f),findsym(sym(f)),a); f2来自百度文库subs(sym(f),findsym(sym(f)),b); if(f1==0) root=a; end if(f2==0) root=b; end if(f1*f2>0) disp('两端点函数值乘积大于0!'); return; else root=FindRoots(f,a,b,eps); end function r=FindRoots(f,a,b,eps) f_1=subs(sym(f),findsym(sym(f)),a); f_2=subs(sym(f),findsym(sym(f)),b); mf=subs(sym(f),findsym(sym(f)),(a+b)/2); if(f_1*mf>0) t=(a+b)/2; r=FindRoots(f,t,b,eps); else if(f_1*mf==0) r=(a+b)/2; else if(abs(b-a)<=eps) r=(b+3*a)/4; else s=(a+b)/2; r=FindRoots(f,a,s,eps); end end end
假定`(x )改变不大,近似取某个近似值L,则有
x1 x* L( x0 x*)
同理
x2 x* L( x1 x*)
x1 x * x0 x * x2 x * x1 x *
两式相比,得
故
x0 x2 x ( x1 x0 ) ~ x* x0 x0 x2 2 x1 x0 x2 2 x1 x0
r = Inf
n=
1028
>> [r,n]=StablePoint('1/sqrt(x)+x-2',0.5)
r= n=
0.3820 4
3.3 迭代收敛的加速方法
1、Aitken加速收敛方法: 由微分中值定理,有
x1 x* ( x0 ) ( x*) ( )(x0 x*)
function [root,n]=StevenStablePoint(f,x0,eps) if(nargin==2) eps=1.0e-4; end tol=1; root=x0; n=0; while(tol>eps) n=n+1; r1=root; y=subs(sym(f),findsym(sym(f)),r1)+r1; z=subs(sym(f),findsym(sym(f)),y)+y; root=r1-(y-r1)^2/(z-2*y+r1); tol=abs(root-r1); end
xk 1 3 xk 1
输入
x1 , , N 0
k 1,2, , N 0
计算
xk 1 x g x1
是 输出
x x1
否
k, x
x1 x k N0
输出
迭代N 0 次还没有达到
精度要求信息
3.2 不动点迭代法
将连续函数方程f(x)=0改写为等价形式:x=(x) 其中(x)也是连续函数,称为迭代函数。 不动点:若x*满足f(x*)=0,则x*=(x*);反之,若 x*=(x*) ,则f(x*)=0 ,称x*为(x)的一个不动点。 不动点迭代: xk 1 ( xk ) (k=0,1,……) 若对任意 x0[a,b],由上述迭代得序列{xk},有极限
2、方程求根的二分法
定理1(介值定理)设函数f(x)在区间[a,b]连续,且f(a)f(b)<0, 则方程f(x)=0在区间[a,b]内至少有一个根。 2.1 二分法的基本思想: 假定f(x)=0在[a,b]内有唯一单实根x*,考察有根区间 [a,b],取中点x0=(a+b)/2,若f(x0)=0,则x*= x0 ,否则, • (1)若f(x0)f(a)>0,则x*在x0右侧,令a1=x0, b1=b; • (2)若f(x0)f(a)<0,则x*在x0左侧,令a1=a, b1= x0。
其中,P是气体压力,V是气体提及,T是绝对温度,R是气体常数。
如果已知某气体的温度T及压力P,那么求体积V的方程为:
f ( x) ( P a )(V b) RT 0 2 V
a ( P 2 )(V b) RT V
V
RT a P 2 V
b g (V )
n=n+1; a1=a2; r1=root;
root=subs(sym(f),findsym(sym(f)),r1)+
r1; x(n)=root; if(n>2) m=m+1; a2=x(m)-(x(m+1)-x(m))^2/(x(m+2)2*x(m+1)+x(m)); tol=abs(a2-a1); end end root=a2;
2 1 2
类推可得
~ xk xk
( xk 1 xk ) xk 2 xk 1 xk 2
2
上式即为Aitken加速收敛方法的迭代格式。
function [root,n]=AtkenStablePoint(f,x0,eps) if(nargin==2) eps=1.0e-4; while(tol>eps) end tol=1; root=x0; x(1:2)=0; n=0; m=0; a2=x0;
2、Steffensen迭代法: 将Aitken加速技巧与不动点结合可得
yk ( xk )
z k ( yk )
2
( yk xk ) xk 1 xk zk 2 yk xk
或将其写为
xk 1 ( xk )
2
[ ( x) x] ( x) x ( ( x)) 2 ( x) x
例:用不动点迭代法、 Aitken加速收敛方法和Steffensen迭代 法分别求方程,并比较这三种方法。 1
x
>> [r,n]=StablePoint('1/sqrt(x)+x-2',0.5) r = 0.3820 n= 4 [r,n]=AtkenStablePoint('1/sqrt(x)+x-2',0.5) r = 0.3820 n= 4 >> [r,n]=AtkenStablePoint('1/sqrt(x)+x-2',0.999) r = 1.0000 n= 4 >> [r,n]=StablePoint('1/sqrt(x)+x-2',0.999) r = 0.3820 n = 21 >> [r,n]=StevenStablePoint('1/sqrt(x)+x-2',0.999) r = 1.0000 n= 2 >> [r,n]=StevenStablePoint('1/sqrt(x)+x-2',0.5) r = 0.3820 n= 4
1 bk ak k (b a ) 2
当k趋于无穷时趋于0。即若二分过程无限继续下去,这 些区间最后必收敛于一点x*,即方程的根。
每次二分后,取有根区间的中点xk= (ak+bk) /2作 为根的近似值,则可得一近似根序列: x0, x1, x2, … 该序列必以根x*为极限。 实际计算中,若给定充分小的正数0和允许误差 限1,当|f(xn)|< 0或bn- an< 1时,均可取x* xn。
建迭代公式: xk 1 x 1 仍取初值x0=1.5,则有x1=2.375, x2=12.396,x3=1904, 结果越来越大。此时称迭代过程发散。
yx
yx
y ( x) y ( x)
收敛
O x * x2 x1
( x)在x * 附近较平缓
yx yx
x0
O
x1
x3 x * x2
实例
例:求方程 x3-x-1=0 在 x=1.5 附近的一个根。
>> [r,n]=StablePoint('x^3-x-1',1.5)
r = NaN
n=
9
实例
例:求方程 1/sqrt(x)+x-2=0 在 x=1.5 附近的一个根。
>> [r,n]=StablePoint('1/sqrt(x)+x-2',1.5)