第5章方程求根的数值解法《计算方法》计算方法方程求根的迭代法§1二分法我们已经熟悉求解一元一次方程、一元二次方程以及某些特殊类型的高次代数方程或非线性方程的方法。这些方法都是代数解法,求出的根是方程的准确根。但是在许多实际问题中遇到的方程,例如代数方程x3-x-1=0或超越方程cos03xxe等等,看上去形式简单,但却不易求其准确根。为此,只能求方程达到一定精度的近似根。方程的形式很多,我们主要讨论一元非线性方程,也即f(x)=0(5―1)方程(5―1)可以有实根,也可以有复根或者重根等。本章主要讨论它的实根的数值计算问题。方程根的数值计算大致可分三个步骤进行:(1)判定根的存在性。(2)确定根的分布范围,即将每一个根用区间隔离开来。(3)根的精确化,即根据根的初始近似值按某种方法逐步精确化,直至满足预先要求的精度为止。设f(x)为定义在某区间上的连续函数,方程(5―1)存在实根。虽然方程(5―1)的根的分布范围一般比较复杂,但我们不难将函数f(x)的定义域分成若干个只含一个实根的区间。例如考虑方程x2-2x-1=0由图5.1所示,该方程的一个负实根在-1和0之间,另一个正实根在2和3之间。图5.1这样,我们总可以假设方程(5―1)(a,b)内有且仅有一个单实根x*。由连续函数的介值定理知f(a)·f(b)<0若数值b-a较小,那么我们可在(a,b)上任取一点x0作为方程的初始近似根。例如,方程f(x)=x3-x-1=0由于f(1)<0,f(1.5)>0,又f(x)在区间(1,1.5)上单调连续,故可知在(1,1.5)内有且仅有一个实根。于是可取某个端点或区间内某一个点的值作为根的初始近似值。设函数f(x)在区间[a,b]上单调连续,且f(a)·f(b)<0则方程(5―1)在区间(a,b)内有且仅有一个实根x。下面在有根区间(a,b)内介绍二分法的基本思想。计算f(a)与f(x0),若f(a)·f(x0)<0则根x∈(a,x0),令a1=a,b1=x0否则x∈(x0,b),令a1=x0,b1=b图5.2如此逐次往复下去,(a,b),(a1,b1),(a2,b2),…,(ak,bk),…其中111()21()2kkkkkkkbabababa这里a0=a,b0=b显然有(5―2)当k→∞时,区间(ak,bk)最终必收敛于一点,该点就是所求方程(5―1)的根x。我们把每次二分后的有根区间(ak,bk)的中点1()2kkkxab作为所求根x的近似值,这样获得一个近似根的序列x0,x1,x2,…,xk,…该序列必以根x为极限,即limkkxx111()2kkkkkxxbaba(5―3)故对于预先给定的精度ε,若有11kkba则结果xk就是方程(5―1)满足预给精度ε的近似根,也即kxx由式(5―2)和(5―3)还可得到误差估计式为11()2kkxxba(5―4)对于确定的精度ε,从式(5―4)易求得需要二等分的次数k。二分法具有简单和易操作的优点。其计算步骤如下,框图如图5.3所示。1.计算步骤①输入有根区间的端点a,b及预先给定的精度ε;②(a+b)/2x;③若f(a)f(x)<0,则xb,转向④;否则xa,转向④。④若b-a<ε,则输出方程满足精度的根x,结束;否则转向②。2.计算框图例1求方程f(x)=x3-x-1=0在区间(1,1.5)内的根。要求用四位小数计算,精确到10-2。解这里a=1,b=1.5取区间(1,1.5)的中点01(11.5)1.252x图5.3由于f(1)<0,f(1.25)<0,则令a1=1.25,b1=1.5得到新的有根区间(1.25,1.5)表5―1§2迭代法的基本思想是:首先将方程(5―1)改写成某种等价形式,由等价形式构造相应的迭代公式,然后选取方程的某个初始近似根x0,代入迭代公式反复校正根的近似值,直到满足精度要求为止。迭代法是一种数值计算中重要的逐次逼近方法。例如,求方程x3-x-1=0在x=1.5附近的一个根(用六位有效数字计算)。首先将原方程改写成等价形式31xx用初始近似根x0=1.5代入式(5―5)的右端可得3011.35721xxx1与x0相差较大,如果改用x1作为近似根代入式(5―5)的右端得32110,1,2,xxk表5―2对于一般形式的方程(5―1),首先我们设法将其化为下列等价形式x=g(x)(5―7)然后按(5―7)构造迭代公式从给定的初始近似根x0出发,按迭代公式(5―8)可以得到一个数列x0,x1,x2,…,xk,…若这个数列{xk}有极限,则迭代公式(5―8)是收敛的。此时数列的极限1(),0,1,2,kkxgxklimkkxx就是原方程(5―1)的根。虽然迭代法的基本思想很简单,但效果并不总是令人满意的。对于上例,若按方程写成另一种等价形式x=x3-1(5―9)建立迭代公式xk+1=x3k-1,k=0,1,2,…仍取初始值x0=1.5,x1=2.375x2=12.3976定理设方程x=g(x)在(a,b)内有根x,g(x)满足李普希茨(Lipschitz)条件:即对(a,b)内任意的x1和x2都有1212()()gxgxqxxq为某个确定的正数,若q<1,则方程在(a,b)内有唯一的根;且迭代公式xk+1=g(xk)对任意初始近似值x0均收敛于方程的根x;还有误差估计式11011kkkkqqxxxxxxqq(5―11)因为,对任意正整数p有11211111()1kpkkpkpkkkkppkkpkkxxxxxxxxqqqxxqqxxq当时,p11kkkpkxxqqxx证由已知条件知,x为方程x=g(x)的根,即x=g(x)()()xgxygy设也是方程的根,即xy于是,由李普希茨条件得因为q<1,所以上式矛盾,故必有xy******)()(yxqygxgyx亦即方程在(a,b)内有唯一的根。再考虑迭代公式xk+1=g(xk),k=0,1,2,…由李普希茨条件10()()kkkxxgxgxqxx(5―12)由(5―12)可得10kkxxqxx(5―13)因为q<1,当k→∞时,qk→0,即有10kxxlimkkxx所以也就是对任意初始值x0迭代公式收敛。利用李普希茨条件111)()(kkkkkkxxqxgxgxx迭代法的几何意义:把方程(5―1)求根的问题改写成(5―7)变为求数列{xn}的极限,实际上是把求根问题转化为求()yxygx迭代过程(5―8)就是在x轴取初始近似值x0,过x0作y轴的平行线交曲线y=g(x)于p0,p0的横坐标为x0,纵坐标为g(x0)(g(x0)=x1),也即p0(x0,x1)再在x轴上取x1作为新的近似值,过x1作y轴的平行线交曲线y=g(x)于p1,p1的横坐标为x1,纵坐标为g(x1)(g(x1)=x2),也即p1(x1,x2)而这相当于过p0引平行于x轴的直线交y=x于Q1(x1,x2)再过Q1引平行于y轴的直线交曲线y=g(x)于p1(x1,x2)仿此可得到点列p0(x0,x1),p1(x1,x2),p2(x2,x3),…若limlimkkkkppxx则迭代法收敛,见图5.4(a);否则迭代法发散,见图5.4(b)。必须说明两点:①要验证g(x)是否满足李氏条件一般比较困难,若g(x)可微,可用充分条件来代替。这里q<1是非常重要的条件,否则不能保证迭代收敛。②对于收敛的迭代过程,误差估计式(5―11)说明迭代值的偏差|xk-xk-1|相当小,就能保证迭代误差|x-xk|足够小。因此在具体计算时常常用条件|xk-xk-1|<ε(5―15)来控制迭代过程结束。()1gxq迭代法的突出优点是算法的逻辑结构简单,且在计算时,中间结果若有扰动,仍不会影响计算结果。其计算步骤为:(1)确定方程f(x)=0的等价形式x=g(x),为确保迭代过程的收敛,要求g(x)满足李普希茨条件(或|g′(x)|≤q<1);(2)选取初始值x0,按公式xk+1=g(xk),k=0,1,2,…进行迭代;(3)若|xk+1-xk|<ε,则停止计算,x≈xk+1。例2求方程x=e-x在x=0.5附近的一个根。按五位小数计算,计算结果的精度要求为ε=10-3。解过x=0.5以步长h=0.1计算f(x)=x-e-x由于f(0.5)<0,f(0.6)>0故所求的根在区间(0.5,0.6)内,且在x=0.5附近()0.61xe图5.5表5―3因此用迭代公式由表可见1xkkex10xxxxe为方程最后,我们给出一个说明,在将方程(5―1)化为等价形式(5―7)时,g(x)的形式是多种多样的,选取不当,迭代公式(5―8)就不会收敛。最一般的形式可以写成x=x+α(x)f(x)(5―16)这里α(x)为任意一个正(或负)的函数。于是g(x)=x+α(x)f(x)(5―17)这样可根据式(5―17)选取α(x),使得迭代公式(5―8)满足收敛条件()11()()gxqaxfx特别当取(5―18)时,由式(5―16)构造的迭代公式为下面要介绍的切线迭代公式;当取11(),1,2,()()kkxxaxkfxfx(5―19)时,可得到弦截迭代公式。§3切线法(牛顿法)切线法是求解方程(5―1)的一种重要迭代方法。如图5.6,曲线y=f(x)与x轴的交点x就是方程(5―1)的根。图5.6与x轴的交点为xk+1,其方程为1()()()0()()()kkkkkkkyfxfxxxfxfxxx点xk+1满足该切线方程,即可得到切线迭代公式(或牛顿迭代公式)1(),0,1,2,()kkkkfxxxkfx(5―20)切线法是非线性方程线性化的方法。其计算步骤为:①给出初始近似根x0及精度ε。②计算③若|x1-x0|<ε,则转向④;否则x1x0,转向②。④输出满足精度的根x1,结束。切线法的计算框图见图5.7。0010()()fxxxfx图5.7例3用切线法求方程xex-1=0的根(取五位小数计算)。取x0=0.5,迭代结果如表5―4所示。由于11kxkkkkxexxxxxe表5―4切线迭代公式(5―20)对应着(5―1)的等价方程()()()fxxxgxfx由于2()()()[()]fxfxgxfx(5―21)若是方程(5―1)的一个单实根,即x()0,()0()0fxfxgx所以,在点附近切线法收敛,而且收敛速度比较快。根据式(5―21)易得切线迭代公式的收敛条件为x2()()()1[()]fxfxgxfx§4切线法迭代简单,收敛速度也较快,但就是需要计算导数f′(x),有时使用会带来麻烦。这一节介绍的弦截法就避免了切线法的不足。点xk+1满足该弦的方程,即有11()()()()kkkkkkfxfxyfxxxxx111()()0()()kkkkkkkfxfxfxxxxx从而可求得弦截迭代公式111()()()()kkkkkkkfxxxxxfxfx(5―23)图5.8表5―5例4用弦截法解方程xex-1=0解取x0=0.5,x1=0.6作为初始近似根,令f(x)=x-e-x=0利用公式(5―23)得到弦截迭代公式为1111()()()kkkxkkkkkxxkkxexxxxxxxe计算结果见表5―5。与切线法的计算结果比较,可以看出弦截法的收敛§5已知方程(5―1)的近似根xk,按迭代公式(5―8)可求得xk+1。现考虑把xk+1作为过渡值,记为1()kkxgx(5―24)11kkkxmxnx(5―25)还是设x为方