root=b; end if(f1*f2>0)
disp('两端点函数值乘积大于0!'); return; else
t1=a+(b-a)*0.382; t2=a+(b-a)*0.618;
f_1=subs(sym(f),findsym(sym(f)),t1); f_2=subs(sym(f),findsym(sym(f)),t2); tol=abs(t1-t2);
while(tol>eps) if(f_1*f_2<0) a=t1; b=t2; else
fa=subs(sym(f),findsym(sym(f)),a); if(f_1*fa>0) a=t2; else b=t1; end end
t1=a+(b-a)*0.382; t2=a+(b-a)*0.618;
f_1=subs(sym(f),findsym(sym(f)),t1); f_2=subs(sym(f),findsym(sym(f)),t2); tol=abs(t2-t1); end
6
%精度控制 root=(t1+t2)/2; %输出根 end 解:
在Matlab命令窗口输入:
root= GoldenSection ('x^3-x-1',1.0,1.5,1.0e-2) 计算出结果为: root = 1.3229
3 迭代法的基本原理及MATLAB实现
迭代法的基本原理
其原理是构造一个迭代公式,反复用它得出一个逐次逼近方程的数列,数列
中的每个元素方程根的近似值,只是精度不同而已。
迭代法求解方程f(x)?0时,先把方程等价地变换成形式
f(x)?x?g(x)?0,移项得出x?g(x),若函数g(x)连续,则称式x?g(x)为迭代函数。用它可构造出迭代公式
xk?1?g(xk),k?0,1,2,?
从初始值x0出发,便可得出迭代序列
?xk??x,x,x,?,xk,?
012如果迭代序列收敛,且收敛于x*,则由式xk?1?g(xk),k?0,1,2,?有
lim(g(xk)?xk?1)?(g(x*)?x*)?f(x*)?0
k??可见,x*便是方程式f(x)?0的根。 迭代法的几何意义
解方程f(x)?0可以等价地变换成求解x?g(x),这就等于求曲线y?x和y?g(x)交点P*的坐标x*。求迭代序列,就等于从图中点x0出发,由函数
y?g(x0)得出y?P0,代入函数y?x中得到Q1,再把Q1的x坐标x1代入方程
7
y?g(x)得出P1,如此继续下去,便可在曲线y?g(x)上得到一系列的点P0,P1,?,Pk,?,这些点的x坐标便是迭代数列x1,x2,?,xk,?,它趋向于方程式f(x)?0的根x*,数列的元素就是方程根的近似值,数列的收敛等价于曲线
y?x和y?g(x)能相交于一点。
迭代公式收敛定理
方程x?g(x)在?a,b?内有根x*,如果 1) 当x??a,b?时,g(x)??a,b?。
2) g(x)可导,且存在正数q?1,使得对任意的x??a,b?都有g'(x)?q?1,则有以下结论:
1. 方程x?g(x)在?a,b?内有唯一的根x*。
2. 迭代公式xk?1?g(xk)对?a,b?内的任意初始近似根x0均收敛于x*。 3. 近视根xk的误差估计公式为
x?xk?*qk1?qx1?x0
由该定理知,将方程f(x)?0转化为等价形式x?g(x)时,选择和构造什么样的迭代函数g(x)非常重要,只有当它满足一定条件时,迭代序列才收敛于方程的根x*。
下面是迭代法的MATLAB函数代码: %迭代法求解非线性方程
function [p0,k,err,p]=Iteration(g,p0,tol,max1) %g是给定的迭代函数 %p0是给定的初始值
%max1是所允许的最大迭代次数 %k所进行的迭代次数加1 %p是不动点的近似值
8
%err是误差 %p(p1,p2……pn) P(1)=p0; for k=2:max1
P(k)=feval('g',P(k-1)); k,err=abs(P(k)-P(k-1)) p=P(k); if(err disp('超过了最大的迭代数量'); end end P 解: 先用M-文件写一个名为g.m的函数。 %迭代法实例函数 function y=g(x) y=x^3-x-1; 在Matlab命令窗口输入: Iteration('g',1.5,10^(-4),10) 由运行结果可知:该迭代过程是发散的,所以没有意义,应重新选取迭代公式。 4 牛顿法的基本原理及MATLAB实现 牛顿法的基本原理 将非线性方程线性化,以线性方程的解逐步逼近非线性方程的解。 把函数f(x)在某一初始值x0点附近展开成泰勒级数,有 9 f(x)?f(x0)?(x?x0)f'(x0)?(x?x0)2f,,(x0)2!?? 取其线性部分,近似的代替函数f(x)可得方程的近似式 f(x)?f(x0)?(x?x0)f'(x0)?0 (x)?0,解该近似方程可得 设f’x1?x0?f(x0) f'(x0)x1可作为方程式的近似解,重复以上过程,得迭代公式 xk?1?xk?按上式可求方程式的近似解。 f(xk) f'(xk) 牛顿法的收敛性 (x)?0,f’’(x)连续且不变号,则只要选取的初在有根区间[a,b]上,f’始值近似根x0满足f(x0)f’'(x)?0,牛顿法必定收敛。 用牛顿迭代公式在某次算得的误差与上次误差的平方成正比。可见,牛顿迭代公式的收敛速度很快。但计算实践表明,当初始值不够好时,牛顿法可能发散。一般可由问题的实际背景来预测或由对分区间法求的较好的初值。 下面是牛顿法的MATLAB函数代码: %牛顿法求解非线性方程 function [p1,err,k,y]=Newton(f,df,p0,delta,max1) %f是非线性函数 10