数值分析1 直接法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
非线性方程与非线性方程组解法
“方程是很多工程和科学工作的发动机”。在工程和科学计算中,如电路和电力系统计算、非线性力学、非线性微分和积分方程、非线性规划等众多领域中,常涉及到非线性方程或非线性方程组的求解问题。
【例如】求代数方程 0842362
5
6
=--++x x x x 的根。 【如】求解方程组
⎩
⎨
⎧-=+=y x y y
x x sin 2.0cos 7.0cos 2.0sin 7.0 诸如此类的问题,归结为寻求函数方程的零点,即求x*使
0*)(≡x f (1)
x*称为方程或方程组(f 为向量函数时)的根或零点。
由于自然现象和实际问题的复杂性,对函数方程和方程组求解问题,没有哪一种方法能求出一般方程的准确解。因此,求其数值解就非常必要了。
先讨论非线性方程求根问题。
§1直接法
直接法的理论依据:设f(x)在区间[a,b]上连续,且f(a)
•f(b)<0,根据连续函数的性质,f(x)在[a,b]内一定有根存在。此时称[a,b]为方程f(x)=0的有根区间。进而,若再加上严格单调,则[a,b]内
一、逐步搜索法----确定有根区间
设f(x)在[a,b]内连续,为求其实单根存在区间,取一点0x (如0x =a ),并取一确定的正数h ,称为步长,令kh x x k ±=0,观察)(k x f 的符号变化情况,当0)()(1<⋅+k k x f x f 时,[1,+k k x x ] 便是一个有根区间,称上述逐步确定有根区间的方法为逐步搜索法。这种方法的计算量,与步长的选取相关,步长h 选取的足够小,就可使有根区间足够精确,当然计算量也较大。
逐步搜索法适用于粗略地估计根的计算问题,一般此方法只用来隔离
01)1(3463)(22>+-=+-='x x x x f
所以f(x)为单调增加函数,则f(x)=0在(-∞,+∞)内最多只有一个实根. 又因为f(x)<0,f(2)>0,所以方程的唯一实根在[0,2]内,[0,2]就是所求的
,即要证f(x)与ox 轴有3个交点,只须证明有3个有根区间,且每个区间内只有一个根。
Matlab 中有根区间的确定:
x=-5:0.01:5;y=exp(x)-3*x.^2;plot(x,y,'r',x,0*x),grid on
title('The Image of f(x)=exp(x)-3*x.^2') xlabel('\fontsize {12} \fontname {宋体} 图1') %axis square
二、二分法
理论依据:设函数f(x)在[a,b]上连续,严格单调,且有f(a)﹒
f(b)<0。
二分法的基本思想:反复对分区间,从而逐步缩小有根区间
步骤:取[a,b]的中点2b
a x +=
,计算)(x f , 若)(x f =0则2
b a x x +==*为所求;否则(1)若0)()(<⋅x f a f ,则令b a a ==11,
(2)若0)()(>⋅b f x f ,则令,,11b b x a ==
形成新的有根区间],[11b a 。对],[11b a 重复上述手续,则又可得
],[22b a 。
如此反复二分下去,得到一系列有根区间:
],[],[],[2211b a b a b a ⊃⊃],[k k b a ⊃⊃ ⊃
其中每个区间长度都是前一个区间长的一半,因此,],[k k b a 的长度
k k k a b a b 2/)(-=-趋于零(当∞→k 时)
【注】由区间套原理,必有*
x 属于所有区间,该点就是方程之根。 序列
}}{{k k b a 及中点2
k k k b a x +=
的序列}{k x 都收敛于*
x 。 终止条件:ε<-=-≤-+*1
2/)(2/)(k k k k a b a b x x (2)
),3,2(,023)(2∈>-='x x x f 因此方程有唯一的根落在(2,3)内。
2)二分次数的确定: 由 005.02/)(1
<-+k a b 得7≥k 即005.07≤-*x x
3)二分步骤:
取21
223=-=
x ,则0625.5)5.2(>=f ,因此根在(2,2.5)内, 再取25.02
2
5.2=-=x ,890625.1)25.2(=f ,因此根在(2,2.5)内,如此二分下去,得
取第7次二分的中点x=(2.09375+2.1015625)/2=2.10 二分法的计算机算法程序: %Erfen.m
function y=refen(fun,a,b,esp) if nargin<4 esp=1e-4;end
if feval(fun,a)*feval(fun,b)<0 n=1;x=(a+b)/2;
while abs(b-a)/2>esp %or x>esp if feval(fun,a)*feval(fun,x)<0 b=x;x=(a+b)/2;
elseif feval(fun,x)*feval(fun,b)<0 a=x;x=(a+b)/2; else y=x;esp=10000; end n,a,b %output n,a,b n=n+1; end y=c;
elseif feval(fun,a)==0 y=a;
elseif feval(fun,b)==0 y=b;
else disp('these,may not be a root in the interval'); end n
调用二分法函数求方程的根: erfen('fun',2,3,0.005)
二分法的优点:算法直观、简单,且总能保证收敛;
缺点:收敛速度较慢。
三、黄金分割法
在二分法中,每次将有根区间[a,b]对分,从而经判断将有根区间缩减一半,达到了逐步缩小有根区间的目的。
黄金分割法的基本思想:如果在[a,b]内适当插入两点,21x x 和,而把有根区间分为三段,通过比较函数值,来缩短有根区间。
问题:如何设置两个插入点的位置,使得在计算同样多函数值的条件下,有根区间能更快缩短?
问题的解决:希望根存在区间的长度按比例β缩小(0<β<1),因此可对称地取)(),)(1(21a b a x a b a x -+=--+=ββ,若设[a,b]的长为1个单位,而且],[],[21b x x a 和的长度相等,即b x ax 21=,若使每次搜索都按同一比率缩短区间,则要