现代数值计算方法第七章
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 , 一直做下去,直到满足精 度为止。
算法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)])
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
分别用向量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 )].
等价变换
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.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 ], 即令 一般地,记当前有根区间为 取
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)])
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
例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 根的插索与二分法
原理:若 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 的一个隔根区间。
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.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 .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 仅由 决定,因此这是一个单步迭代 公式。
例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]
第七章 非线性方程迭代法
求 f (x) = 0 的根
其中 f ( x ) 是连续的非线性函数。而方程按 f ( x ) 是多项 式或超越函数又分别称为代数方程和超越方程。例如,代数 方程
x 3 x 2 0,
8 3
超越方程
sin
x
2
e
x
0.
已经证明,对于5次及5次以上的一元多项式方程不存在精确 的求根公式,至于超越方程就更难求其精确解了。鉴于此, 如何求得满足一定精度的方程的近似根,已成为广大科研工 作者迫切需要解决的问题。