数值分析实验报告——方程求根

  • 格式: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,并结合网上查阅的资料,才又掌握了一些基础的运用方法。

一开始忘了怎么创建函数文件,于是实现二分法的程序时变得十分麻烦。后来复习过后,运用在牛顿法上,就简单了许多。

二分法与牛顿法是比较容易掌握并实现的,而后两个方法则是查阅了很多资料,却仍然似懂非懂,程序也是大部分参考了资料。我将在此之后继续钻研它们,直到能熟练运用为止。