现代数值计算方法第七章
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ln b a ln ε
ln 2
1
同时由 | x k x * | 0 ( k ),
知 lim x k x * . k
①简单; 收敛 由此可知,序列{xk}的收敛 ② 对f (x) 要求不高(只要连续即可) . 性与区间[a,b]无关,故对任 ①无法求复根及重根 给区间[a,b],{xk}均收敛 ② 收敛慢
例7.4 用简单迭代法通用程序maiter.m求方程 x -5 f ( x ) xe 1 0 在[0,1]内的一个实根,取定精度 10 . 初始点为 x 0 0 . 5 . 解 迭代法成功的关键在如何适当选取迭代函数。本问题 可将原方程等价变形为至少下列三种形式
7.1.2
二分法及其程序实现
二分法的基本思想是通过计算隔根区间的中点,逐步将 f( 隔根区间缩小,从而可得到方程的近似根数列。具体地说,设 x ) 为连续函数,又设方程的隔根区间为 [ a , b ], 即 f ( a ) f ( b ) 0 . 记 a 0 : a , b 0 : b , 取其中点 x 0 ( a 0 b 0 ) / 2 , 若 f ( a 0 ) f ( x 0 ) 0 , 则去掉右半区间,即令 a 1 : a 0 , b1 : x 0 ; 否则,去掉左半区间, a 1 : x 0 , b1 : b 0 . [ a k , b k ], 即令 一般地,记当前有根区间为 取
第七章 非线性方程迭代法
求 f (x) = 0 的根
其中 f ( x ) 是连续的非线性函数。而方程按 f ( x ) 是多项 式或超越函数又分别称为代数方程和超越方程。例如,代数 方程
x 3 x 2 0,
8 3
超越方程
sin
x
2
e
x
0.
已经证明,对于5次及5次以上的一元多项式方程不存在精确 的求根公式,至于超越方程就更难求其精确解了。鉴于此, 如何求得满足一定精度的方程的近似根,已成为广大科研工 作者迫切需要解决的问题。
例7.1 试用逐步搜索法确定方程
f ( x) x x 3x 3 0
3 2
的有根区间。 容易看出,当 | x | 3 时,f ( x ) 保持符号不变,故其根必 定全部落在区间[-3,3]内,即可初步确定 a - 3 , b 3,取步 长h=0.6,利用算法7.1的通用程序masearch.m,在MATLAB窗 口执行: >>masearch(inline(‘x^3_x^2-3*x-3’),-3,3,0.6) 得计算结果: ans= -1.8000 -1.2000 ans= -1.2000 -0.6000 ans= 1.2000 1.8000 即有三个根,分别在区间[-1.8,-1.2],[-1.2,0.6],[1.2,1.8]
| x k x * | 1
k 1
2
(b a ) ,
2 其中 a 1, b 2 , 精度 0 . 05 , 那么可求得 k (ln 20 / ln 2 ) 1 3 . 3219 ,
取k=4即可,用公式(7.2)求解得 x * x 4 1 . 9063 , 具体过程如下
等价变换
f (x) = 0 f (x) 的根
x = (x)
(x) 的不动点
从一个初值 x0 出发,计算 x1 = (x0), x2 = (x1), …, 思 xk+1 = (xk), … 若 x k k 0 收敛,即存在 x* 使得 路 lim x k x * ,且 连续,则由 lim x lim x 可 k 1 k k k k 知 x* = (x* ),即x* 是 的不动点,也就是f 的根。 其中 x k 1 ( x k ), k 0 ,1, ,
例7.2 用二分法程序mabisec.m求方程 f ( x ) xe x 1 0 -5 在[0,1]内的一个实根,取定精度 10 .
解
在MATLAB窗口执行:
>>mabisec(inline(‘x*exp(x)-1’),0,1,1e-5) 得计算结果: k=16 x= 0.5714630126953 即迭代16次后,得到满足精度的近似根。
算法 7.1(逐步搜索法) 步1 步2 步3 输入 a , b , h ; 置 a 1 : a , b1 : a h ; while ( b1 b ) (循环开始) if f ( a1 ) f ( b1 ) 0 then
x1 ( k ) : a 1 , x 2 ( k ) : b1 ;
例7.3 用二分法求方程 在区间[1,2]内的 根,使其精度达到两位有效数字。问需要将区间二分多少次? a 1 b( b a ) | x x * x | ( 7 .( 7 . 2 ) 3) 并求出满足精度的近似根。 , 2
k
x 3x 1 0
3
k
k
k 1
k
来自百度文库
解
根据(7.3)可以估计二分次数k的大小。设
算法7.3 (简单迭代法) 取初始点 x 0 , 最大迭代次数N和精度要求 , 置 k : 0 ; 计算 x k 1 ; 若 | x k 1 x k | , 则停算; 若 k N , 则停算;否则,置 k : k 1, 转步2。
步1 步2 步3 步4
function x=maiter(phi,x0,ep,N) %用途:用简单迭代法求非线性方程f(x)=0有根区间[a,b]中的一个根 %格式:x= maiter(phi,x0,ep,N) fun为f(x)的函数句柄,x0为初值, % ep为精度(默认1e-4),N为最大迭代次数(默认500),x返回近似根 if nargin<4,N=500;end if nargin<3,ep=1e-4;end k=0; while k<N x=feval(phi,x0); if abs(x-x0)<ep break; end x0=x;k=k+1; end if k==N, warning('已达迭代次数上限'); end disp(['k=',num2str(k)])
什么时候停止?
a x1 a x*
b x2
b
x k 1 x k ε1
或
f ( x ) ε2
不能保证 x 的精 度
2
x* x
算法 7.2(二分法)
步1 步2 步3 步4 步5 由算法7.1得到隔根区间 [ a , b ], 设定精度要求 ; 置 x : ( a b ) / 2 ; 若 f ( x ) 0 , 输出 x , 停算;否则,转步4; 若 f ( a ) f ( x ) 0 , 则置 b : x ; 否则,置 a 1 : x ; 置 x ( a b ) / 2 , 若 | b a | , 输出 x 停算;否 则,转步3。
本章要介绍:二分法,迭代法及其加速,牛顿法
§7.1 根的插索与二分法
原理:若 f C[a, b],且 f (a) · (b) < 0,则 f 在 (a, b) 上必 f 有一根。 7.1.1 隔根区间
在用近似方法求方程的根时,需要知道方程的根所在的区 间。如果在区间[a,b]内只有方程 f ( x ) 0 的一个根,则称区 间[a,b]为隔根区间。通常可以用逐步扫描法来寻找隔根区间。 算法的基本思想是:先确定方程 f ( x ) 0 的所有实根所在的 h 区间[a,b],再按选定的步长 ( b a ) / n (n为正整数),逐 xk f ( xk ) 点计算 a kh 处的函数值) ( k 0 ,1, , n ), f ( x当 f ( x k 1 ) 与 k 的值异号时,则 [ x k , x k 1 ] 即为方程 f ( x ) 0 的一个隔根区间。
( 7 .5 )
称为迭代格式
y p1 p0
y=x y= (x)
y p0
y=x
x x0 y x1 x* y=x y y= (x) p0 x0 x* y= (x)
p1 y= (x) x x1 y=x
p0 p1
x x0 x*
p1
x
x1 x0 x*
x1
x k 1 ( x k ), k 0 ,1, ,
( 7 .5 )
总之,若序列 { x k } 存在极限 x *, 即
lim x k x *,
k
则称迭代过程(或迭代公式)是收敛的。如果函数 ( x ) 连续, 在式(7.5)两端取极限得到
x * ( x *),
则 x * 是方程 x ( x ) 的根。我们也称 x * 是函数 ( x ) 的一个 不动点,因此也称迭代公式(7.5)为不动点迭代。在迭代公 x xk 式(7.5)中,由于k 1 仅由 决定,因此这是一个单步迭代 公式。
分别用向量x1,x2 存放隔根区间的左、 右端点
else
a 1 : b1 , b1 : b1 h ;
continue; (返回循环的入口) end
a 1 : b1 , b1 : b1 h ;
检测下一个区间!
k : k 1;
步4
end (循环结束) 输出有根区间 [ x1 ( k ), x 2 ( k )].
7.1.3
二分法的收敛性分析
误差 分析: 第1步产生的
x0 ab 2
有误差
|x 0 x*|
ba
ba 2
k 1
第 k 步产生的
xk 有误差 |x k x*|
2 bk a k
2
对于给定的精度 ,可估计二分法所需的步数 k :
b a 2
k 1
ε
k
function masearch(fun,a,b,h) %用途:搜索非线性方程f(x)=0的有根区间 %格式:masearch(fun,a,b,h) fun为函数表达式, % a, b为区间左右端点,h为搜索步长 n=(b-a)/h; a1=zeros(1,n); b1=zeros(1,n); aa=a; bb=aa+h; k=1; while bb<b if feval(fun,aa)*feval(fun,bb)<0 a1(k)=aa; b1(k)=bb; else aa=bb; bb=aa+h; continue; end aa=bb; bb=aa+h; k=k+1; end for i=1:k if a1(i)-b1(i)~=0 [a1(i),b1(i)] end end
xk a k bk 2
,
( 7 .2 )
若 f ( a k ) f ( x k ) 0 , 则令 a k 1 : a k , b k 1 : x k ; 否则,令 a k 1 : x k , b k 1 : b k ; 再取 x k ( a k 1 b k 1 ) / 2 , 一直做下去,直到满足精 度为止。
k 0 1 2 3 4
ak 1 1.5 1.75 1.875 1.875
bk 2 2 2 2 1.9375
xk 1.5 1.75 1.875 1.9375 1.90625
bk-ak f(ak)f(xk) 1 + 0.5 + 0.25 + 0.125 0.0625
§7.2 简单迭代法及其加速技巧
能够得到递推形式的算法称为迭代法。它是一种逐次逼 近法。其基本思想是:先给出方程根的近似值(初始值),反 复使用某递推公式,校正根的近似值,使之逐渐精确化,最后 得到满足精度要求的方程的近似解。
function x=mabisec(fun,a,b,ep) %用途:用二分法求非线性方程f(x)=0有根区间[a,b]中的一个根 %格式:x=mabisec(fun,a,b,ep) fun为函数表达式, % a, b为区间左右端点,ep为精度,x返回近似根 x=(a+b)/2.0; k=0; while abs(feval(fun,x))>ep|(b-a>ep) if feval(fun,x)*feval(fun,a)<0 b=x; else a=x; end x=(a+b)/2.0; k=k+1; end disp(['k=',num2str(k)])