数值分析实验报告4.docx

上传人:b****2 文档编号:16982604 上传时间:2023-07-20 格式:DOCX 页数:12 大小:19.13KB
下载 相关 举报
数值分析实验报告4.docx_第1页
第1页 / 共12页
数值分析实验报告4.docx_第2页
第2页 / 共12页
数值分析实验报告4.docx_第3页
第3页 / 共12页
数值分析实验报告4.docx_第4页
第4页 / 共12页
数值分析实验报告4.docx_第5页
第5页 / 共12页
数值分析实验报告4.docx_第6页
第6页 / 共12页
数值分析实验报告4.docx_第7页
第7页 / 共12页
数值分析实验报告4.docx_第8页
第8页 / 共12页
数值分析实验报告4.docx_第9页
第9页 / 共12页
数值分析实验报告4.docx_第10页
第10页 / 共12页
数值分析实验报告4.docx_第11页
第11页 / 共12页
数值分析实验报告4.docx_第12页
第12页 / 共12页
亲,该文档总共12页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

数值分析实验报告4.docx

《数值分析实验报告4.docx》由会员分享,可在线阅读,更多相关《数值分析实验报告4.docx(12页珍藏版)》请在冰点文库上搜索。

数值分析实验报告4.docx

数值分析实验报告4

实验报告

 

实验项目名称非线性方程与方程组的数值解法

实 验 室 数学实验室 

所属课程名称数值逼近

实验类型算法设计

实验日期

 

班级

学号

姓名

成绩

 

实验概述:

【实验目的及要求】

本次实验的目的是熟练《数值分析》第七章“非线性方程与方程组的数值解法”的相关内容,掌握方程求根与二分法、加权加速法、埃特金加速法、牛顿法、弦截法、抛物线法以及复根的情况。

本次试验要求编写二分法、加权加速法、埃特金加速法、牛顿法、弦截法、抛物线法等方法的程序编码,并在MATLAB软件中去实现。

【实验原理】

《数值分析》第七章“非线性方程与方程组的数值解法“的相关内容,包括:

方程求根与二分法、加权加速法、埃特金加速法、牛顿法、弦截法、抛物线法等的相应算法和相关性质。

【实验环境】(使用的软硬件)

软件:

MATLAB2012a

硬件:

电脑型号:

联想Lenovo昭阳E46A笔记本电脑

操作系统:

Windows8专业版

处理器:

Intel(R)Core(TM)i3CPUM350@2.27GHz2.27GHz

 

实验内容:

【实验方案设计】

第一步,将书上关于方程求根与二分法、加权加速法、埃特金加速法、牛顿法、弦截法、抛物线法等的内容转化成程序语言,用MATLAB实现;第二步,分别用以上求积公式的程序编码求解不同的问题。

【实验过程】(实验步骤、记录、数据、分析)

实验的主要步骤是:

首先分析问题,根据分析设计MATLAB程序,利用程序算出问题答案,分析所得答案结果,再得出最后结论。

 

实验一:

求方程X3+4X2-10=0在X0=1.5附近的一个根,迭代函数为X=(

(精度达到10-6)

(1)用一般法求根

(2)用加权加速法求根

(3)用埃特金加速法求根

(4)找到另外一个迭代函数,用以上三种方法求根

(5)用matlab自带函数找根

(6)用Newton法求根

(7)用弦截法求根

(8)用抛物线法求根

(9)找出其他根,是否有复根,并比较以上哪种方法速度快

(1)在MATLAB的Editor中建立一个M-文件,输入程序代码,实现一般法求根的程序代码如下:

function[y,n]=BDD(x,eps)

ifnargin==1

eps=1e-6;

xl=gg(x);

n=1;

E=abs(xl-x);

while(E>=eps)&&(n<=10000)

x=xl;

xl=gg(x);

n=n+1;

E=abs(xl-x);

end

y=x;

k=n

end

end

functionf=gg(x)

f=sqrt(10/(4+x));

end

在commandWindows中输入命令:

formatlong及BDD(1.5),得出的结果为:

>>formatlong

BDD(1.5)

k=

7

ans=

1.365230575673434

(2)在MATLAB的Editor中建立一个M-文件,输入程序代码,实现加权加速求根的程序代码如下:

function[y,n]=WA(a,eps)

ifnargin==1

eps=1e-16;

end

symsx

L=subs(diff(sqrt(10/(4+x))),a);

xl=gg(a,L);

n=1;

E=abs(xl-a);

while(E>=eps)&(n<=10000)

x=xl;

xl=gg(x,L);

n=n+1;

E=abs(xl-x);

end

y=x;

k=n

end

functionf=gg(x,L)

f=(sqrt(10/(4+x))-L.*x)/(1-L);

end

在commandWindows中输入命令:

WA(1.5),得出的结果为:

>>WA(1.5)

k=

4

ans=

1.365230008676674

(3)在MATLAB的Editor中建立一个M-文件,输入程序代码,实现埃特金求根的程序代码如下:

function[y,n]=ATJ(a,eps)

ifnargin==1

eps=1e-6;

end

symsx

x0=subs(f(x),a);

x1=subs(f(x),x0);

x2=gg(x0,x1,a);

n=1;

E=abs(x2-a);

while(E>=eps)&(n<=10000)

X=x2;

x0=subs(f(x),X);

x1=subs(f(x),x0);

x2=gg(x0,x1,X);

n=n+1;

E=abs(x2-X);

end

y=X;

k=n

end

functionh=f(x)

h=sqrt(10/(4+x));

end

functionf=gg(x,y,z)

f=y-((y-x)^2)/(y-2*x+z);

end

在commandWindows中输入命令:

ATJ(1.5),得出的结果为:

>>ATJ(1.5)

k=

3

ans=

1.365230013416586

(4)在以上三题中的代码的基础上进行修改:

functionf=gg(x)

f=sqrt(2.5-(x^3)/4);

end

则三种方法运行出的结果分别为:

>>BDD(1.5)

k=

20

ans=

1.365229578333959

>>WA(1.5)

k=

6

ans=

1.365230351032824

>>ATJ(1.5)

k=

4

ans=

1.365230013413594

(5)在MATLAB的Editor中建立一个M-文件,输入程序代码,实现matlab自带函数求根的程序代码如下:

fun=@(x)x.^3+4*(x.^2)-10;

x=fzero(fun,1.5)

commandWindows中输出结果:

x=

1.365230013414097

(6)在MATLAB的Editor中建立一个M-文件,输入程序代码,实现Newton求根的程序代码如下:

function[y,n]=Newton(a,eps)

ifnargin==1

eps=1e-16;

end

symsx

L=subs(diff(f(x)),a);

xl=subs(x-f(x)/L,a);

n=1;

E=abs(xl-a);

while(E>=eps)&(n<=10000)

X=xl;

L=subs(diff(f(x)),X);

xl=subs(x-f(x)/L,X);

n=n+1;

E=abs(xl-X);

end

y=X;

k=n

end

functionf=f(x)

f=x^3+4*x^2-10;

end

在commandWindows中输入命令:

Newton(1.5),得出的结果为:

>>Newton(1.5)

k=

4

ans=

1.365230013916147

(7)在MATLAB的Editor中建立一个M-文件,输入程序代码,实现弦截法求根的程序代码如下:

function[y,n]=XJF(a,eps)

ifnargin==1

eps=1e-6;

end

symsx

x1=a+0.1;

A=ff(x1);

B=ff(a);

x2=gg(x1,a,A,B);

n=1;

E=abs(x2-x1);

while(E>=eps)&(n<=10000)

X=x1;

x1=x2;

A=ff(x1);

B=ff(X);

x2=gg(x1,X,A,B);

n=n+1;

E=abs(x2-x1);

end

y=x1;

k=n

end

functionh=ff(x)

h=x.^3+4*x.^2-10;

end

functionf=gg(x,y,z,w)

f=x-((x-y)*z)/(z-w);

end

在commandWindows中输入命令:

XJF(1.5),得出的结果为:

>>XJF(1.5)

k=

5

ans=

1.365230020178121

(8)在MATLAB的Editor中建立一个M-文件,输入程序代码,实现抛物线法求根的程序代码如下:

function[y,n]=parabola(fx,a,b,c,eps)

if(nargin==4)

eps=1e-6;

symsx

fa=subs(fx,a);

fb=subs(fx,b);

fc=subs(fx,c);

fb_a=(fb-fa)/(b-a);

fc_b=(fc-fb)/(c-b);

fc_b_a=(fc_b-fb_a)/(c-a);

w=fc_b+fc_b_a*(c-b);

x0=c-2*fc/(w+(w^2-4*fc*fc_b_a)^.5);

n=1;

if(abs(x0-c)>eps&&n<=10000)

a=b;

b=c;

c=x0;

fa=subs(fx,a);

fb=subs(fx,b);

fc=subs(fx,c);

fb_a=(fb-fa)/(b-a);

fc_b=(fc-fb)/(c-b);

fc_b_a=(fc_b-fb_a)/(c-a);

w=fc_b+fc_b_a*(c-b);

x0=c-2*fc/(w+(w^2-4*fc*fc_b_a)^.5);

n=n+1;

end

y=x0;

n;

end

end

在commandWindows中输入命令:

fx=x^3+4*x^2-10;

[y,n]=parabola(fx,1.5,1.6,1.378888322284549),得出的结果为:

>>fx=x^3+4*x^2-10;

[y,n]=parabola(fx,1.5,1.6,1.378888322284549)

y=

1.365230018508053

n=

2

(10)在commandWindows中输入命令:

p=[1,4,0,-10];roots(p),得出的结果为:

>>p=[1,4,0,-10];

roots(p)

ans=

-2.682615006707049+0.358259359924043i

-2.682615006707049-0.358259359924043i

1.365230013414097

前两个根是复根。

【结论】(结果)

通过以上的计算可以看出,埃特金和抛物线法比较快,埃特金需要三次迭代,抛物线只需要两次迭代就达到了要求的精度。

 

【小结】

通过此次实验,我对方程求根与二分法、加权加速法、埃特金加速法、牛顿法、弦截法、抛物线法有了更进一步的了解。

迭代法中牛顿法最实用,而弦截法和抛物线法不需要f(x)的导数,又具有超线性收敛,尤其是抛物线法收敛速度很快,也是常用的有效方法。

而matlab中有自带的函数可以求方程的根,fzero计算初值附近的一个根,函数roots计算多项式所有零点。

 

指导教师评语及成绩:

 

成绩:

指导教师签名:

批阅日期:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 解决方案

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2