2013/2014第一学期
数值分析课程设计
设计题目:
非线性方程的数值解法及MATLAB解法 信息与计算科学 专业
学号 姓名 学号 姓名 学号 姓名
成绩 指导老师
摘 要
本论文分析总结了非线性方程的求解的几种方法,主要介绍非线性方程的数值解法,是直接从方程出发,逐步缩小根的存在区间,或逐步将根的近似值精确化,直到满足问题对精度的要求。分别介绍了二分法,黄金分割法,迭代法,Newton法,弦截法,抛物法,还详细编写注释了这几种方法的Matlab函数代码。并通过具体的例子对他们做出分析,通过各种方法的对照比较得出各个算法的优缺点。
关键词:非线性方程 二分法 黄金分割法 迭代法 弦截法 Matlab
问 题 提 出
1.5]1. 分别用二分法,黄金分割法求方程f(x)?x3?x?1?0在区间[1.0,内的一个实根,要求准确到小数点后第2位。(书P214)
2. 用迭代法求方程f(x)?x3?x?1?0在x0?1.5附近的根x*。(书P215) 3. 分别用牛顿法,弦截法,抛物法求方程f(x)?xex?1?0。(书P223,P229)
1 二分法的基本原理及MATLAB实现
二分法的基本思想:
介值定理:若函数在区间[a,b]上连续,且f(a)f(x)?0,则存在x???a,b?,使得f(x*)?0。
设区间[a,b]是有根区间,令a0?a,b0?b,取区间中点 x0?a0?b02。
考查中点x0的函数值情况,若f(a0)f(x0)?0,则由介值定理可知,
此时令a1?a0,b1?x0;否则f(a0)f(x0)?0(不考虑等号情况,x*?[a0,b0],
否则f(x0)?0,已得到方程的根),因此得到f(a0)则x*?[x0,b0],f(x0)?0,
2
此时令a1?x0,b1?b0,再取x1?a1?b12。
设当前的有根区间[ak,bk],取xk?ak?bk2,若f(ak)f(xk)?0,则令
ak?1?ak,bk?1?xk;否则令ak?1?xk,bk?1?bk;再取xk?入下一轮计算。 二分法的几何意义:
逐步将区间对分,得到根的近似值。 二分法的收敛性质:
ak?1?bk?12,转
设初始有根区间为[a,b],x*是方程的根,xk为第k次区间[ak,bk]的中点(初始区间记为0次)则
xk?x*?bk?ak2?bk?1?ak?122???b?a2k?1
上式给出了算法的终止条件,当
bk?ak2??时算法停止计算。其中,?是预先
给定的精度要求。上式同时表明。当k??有xk?x*?0。因此序列的收敛性与初始区间[a,b]无关,二分法是大范围收敛的。 下面是二分法的MATLAB函数代码: %二分法求解非线性方程 function root=HalfInterval(f,a,b,eps) if(nargin==3) eps=1.0e-4; end
f1=subs(sym(f),findsym(sym(f)),a); f2=subs(sym(f),findsym(sym(f)),b); if(f1==0) root=a; end
3
if(f2==0) root=b; end if(f1*f2>0)
disp('两端点函数值乘积大于0!'); return; else
root=FindRoots(f,a,b,eps); end
function r=FindRoots(f,a,b,eps) f_1=subs(sym(f),findsym(sym(f)),a); %f_2=subs(sym(f),findsym(sym(f)),b); mf=subs(sym(f),findsym(sym(f)),(a+b)/2); if(f_1*mf>0) t=(a+b)/2;
r=FindRoots(f,t,b,eps); else
if(f_1*mf==0) r=(a+b)/2; else
if(abs(b-a)<=eps) r=(b+3*a)/4; else
s=(a+b)/2;
r=FindRoots(f,a,s,eps); end end end 解:
4
在Matlab命令窗口输入:
root=HalfInterval('x^3-x-1',1.0,1.5,1.0e-2) 计算出结果为: root = 1.3252
2 黄金分割法的基本原理及MATLAB实现
二分法是把区间的长度减半,黄金分割法是把区间逐步缩短为前一次的0.618倍,其求解步骤如下:
1)
设t1?a?(1?0.618)*(b?a),t2?a?(1?0.618)*(b?a),且f1?f(t1),f2?f(t2).
2)
如果t1?t2??(?为给定的最小区间长度),则输出方程的根为
t1?t22;否则转到3)。
3)
如果f1*f2?0,则令a?t1,b?t2,转1),否则如果
f1*f(a)?0,令a?t2,反之令b?t1,转到1).
下面是黄金分割法的MATLAB函数代码: %黄金分割法求解非线性方程 function root=GoldenSection(f,a,b,eps) if(nargin==3) eps=1.0e-4; end
f1=subs(sym(f),findsym(sym(f)),a); f2=subs(sym(f),findsym(sym(f)),b); if(f1==0) root=a; end if(f2==0)
5