数值分析实验报告——方程求根
- 格式:doc
- 大小:150.50 KB
- 文档页数:6
《数值分析》实验报告
班级 信科1501 学号 150803114 姓名 梁恩昊 日期 2017.10.3
学 院 数学科学学院 专 业 信息与计算科学
课程名称 数值分析 成 绩
实验一 方程求根
一、 实验目的:
掌握二分法、Newton法、不动点迭代法、弦截法求方程的根的各种计算方法、并实施程序调试和运行,学习应用这些算法于实际问题。
二、 实验内容:
二分法、Newton法、不动点迭代法、弦截法求方程的根、程序的调试和运行,给出实例的计算结果。观察初值对收敛性的影响。
三、 实验步骤:
① 、二分法:
定义:对于区间[a,b]上连续不断且f(a)·f(b)<0的函数y=f(x),通过不断地把函数f(x)的零点所在的区间一分为二,使区间的两个端点逐步逼近零点,进而得到零点近似值的方法叫二分法。
实现方法:首先我们设一方程400*(x^4)-300*(x^3)+200*(x^2)-10*x-1=0,并求其在区间[0.1,1]上的根,误差限为e=10^-4。
PS:本方法应用的软件为matlab。
disp('二分法')
a=0.1;b=1;
tol=0.0001;
n0=100;
fa=400*(a.^4)-300*(a.^3)+200*(a.^2)-10*a-1;
for i=1:n0 p=(a+b)/2;
fp=400*(p.^4)-300*(p.^3)+200*(p.^2)-10*p-1;
if fp==0||(abs((b-a)/2) disp('用二分法求得方程的根p=') disp(p) disp('二分迭代次数为:') disp(i) break; end; if fa*fp>0 a=p; else b=p; end; end; if i==n0&&~(fp==0||(abs((b-a)/2) disp('次二分迭代后没有求出方程的根') end; 程序调试: 运行结果: 用二分法求得方程的根p= 0.1108 二分迭代次数为: 14 ② Newton法 定义:取定初值x0,找到函数对应的点,然后通过该点作函数切线,交x轴,得到新的横坐标值,然后找函数对应的点,做切线,得到新的横坐标值,重复上述步骤,多次迭代,直到收敛到需要的精度。 实现方法:我们与二分法一样,先设一方程400*(x^4)-300*(x^3)+200*(x^2)-10*x-1=0,并求其在区间[0.1,1]上的根。 PS:本方法应用的软件为matlab。 syms x; diff(400*(x.^4)-300*(x.^3)+200*(x.^2)-10*x-1) %求导方程 函数文件: function Newton=fun(a) Newton=400*(a.^4)-300*(a.^3)+200*(a.^2)-10*a-1; end function Newton2=dfun(b) Newton2=1600*b^3-900*b^2+400*b-10; %fun函数的导数 end 主程序: x0=1; while 1 x1=x0-fun(x0)/dfun(x0); if abs(x1-x0)<1e-8 || abs(fun(x1))<1e-10 break; end x0=x1; end disp('用牛顿法求得的方程的根为:x=') disp(x1) 程序调试: 运行结果: 用牛顿法求得的方程的根为: x=0.1108 ③ 、不动点迭代法: 采用不动点迭代法计算非线性方程x3+4x2-10=0,在区间[1,2]上的一个根。 PS:本方法应用的软件为matlab。 不动点迭代法程序: 函数文件: function [y,n]=BDD(x,eps) if nargin==1 eps=1.0e-6; elseif nargin<1 error return end x1=gg(x); n=1; while (norm(x1-x)>=1e-6)&&(n<=10000) x=x1; x1=gg(x); n=n+1; end y=x; M函数: function f=gg(x) f(1)=sqrt(2.5-(x^3)/4); 结果如下: >> BDD(1) n = 21 ans = 1.3652 ④ 、弦截法: 定义:弦截法是求非线性方程近似根的一种线性近似方法。它是以与曲线弧AB对应的弦AB与x轴的交点横坐标作为曲线弧AB与x轴的交点横坐标的近似值μ来求出方程的近似解。该方法一般通过计算机编程来实现。弦截法的原理是以直代曲即用弦(直线)代替曲线求方程的近似解,也就是利用对应的弦 与 轴的交点横坐标来作为曲线弧 与 轴的交点横坐标 的近似值。 实现方法:我们与二分法一样,先设一方程400*(x^4)-300*(x^3)+200*(x^2)-10*x-1=0,并求其在区间[0.1,1]上的根。 PS:本方法应用的软件为matlab。 函数文件: function[p1,err,k,y]=secant(f,p0,p1,delta,max1) % f是非线性函数 %p0,p1是初始值 %delta是给定允许误差 %max1是迭代次数的上限 %p1是所求得的方程的近似解 %err是p1-p0的误差估计 %k是所需要的迭代次数 %y=f(p1) K=0,p0,p1,feval('f',p0),feval('f',p1) for k=1:max1 p2=p1-feval('f',p1)*(p1-p0)/(feval('f',p1)-feval('f',p0)); err=abs(p2-p1); p0=p1; p1=p2; k,p1,err,y=feval('f',p1) if(err break,end end end M文件:secant('400*(x^4)-300*(x^3)+200*(x^2)-10*x-1=0',0,1,1.0e-4,100); disp('用弦截法求得的方程的根为:x=') disp(p1) 运行结果: 用弦截法求得的方程的根为: x=0.1108 四、 实验中遇到的问题及解决方法: MATLAB运用不熟练,于是翻开以前的课本与ppt,并结合网上查阅的资料,才又掌握了一些基础的运用方法。 一开始忘了怎么创建函数文件,于是实现二分法的程序时变得十分麻烦。后来复习过后,运用在牛顿法上,就简单了许多。 二分法与牛顿法是比较容易掌握并实现的,而后两个方法则是查阅了很多资料,却仍然似懂非懂,程序也是大部分参考了资料。我将在此之后继续钻研它们,直到能熟练运用为止。