matlab实现Newton法割线法抛物线法.docx
- 文档编号:26161559
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:13
- 大小:45.09KB
matlab实现Newton法割线法抛物线法.docx
《matlab实现Newton法割线法抛物线法.docx》由会员分享,可在线阅读,更多相关《matlab实现Newton法割线法抛物线法.docx(13页珍藏版)》请在冰豆网上搜索。
matlab实现Newton法割线法抛物线法
〔一〕实验目的:
熟悉和掌握Newton法,割线法,抛物线法的方法思路,并能够在matlab上编程实现
〔二〕问题描述:
问题一.方程求根
(1).给定一个三次方程,分别用Newton法,割线法,抛物线法求解.
方程的构造方法:
(a)根:
方程的根为学号的后三位乘以倒数第二位加1再除以1000.
假设你的学号为B06060141,那么根为141*(4+1)/1000=0.564
(b)方程:
以你的学号的后三位数分别作为方程的三次项,二次项,一次项的系数,根据所给的根以及三个系数确定常数项.
例如:
你的学号是B06060141,那么你的方程是x3+4x2+x+a0=0的形式.
方程的根为0.564,因此有
0.5643+4*0.5642+0.564+a0=0,于是a0=-2.015790144
你的方程为x3+4x2+x-2.015790144=0.
(2)假设方程是sinx+4x2+x+a0=0的形式〔三个系数分别是学号中的数字〕,重新解决类似的问题
(3)构造一个五次方程完成上面的工作.
四次方程的构造:
将三次多项式再乘以(x-p*)2得到对应的五次多项式(p*为已经确定的方程的根,显然,得到的五次方程有重根).
(4)将〔2〕中的方程同样乘以(x-p*)得到一个新的方程来求解
〔三〕算法介绍
在本文题中,我们用到了newton法,割线法,抛物线法。
1.Newton法迭代格式为:
当初值
与真解足够靠近,newton迭代法收敛,对于单根,newton收敛速度很快,对于重根,收敛较慢。
2.割线法:
为了回避导数值
的计算,使用
上的差商代替
,得到割线法迭代公式:
割线法的收敛阶虽然低于newton法,但迭代以此只需计算一次
函数值,不需计算其导数,所以效率高,实际问题中经常应用。
3.抛物线法:
可以通过三点做一条抛物线,产生迭代序列的方法称为抛物线法。
其迭代公式为:
其中
收敛速度比割线法更接近于newton法。
对于本问题的解决就以上述理论为依据。
终止准那么为:
此题中所有
取1e-6。
〔四〕程序
注:
n表示迭代步数。
第一题〔1〕首先根据题目要求对方程进展构造,得到的方程为:
。
Newton法求解算法
建立newton1.m源程序,源程序代码为:
functionx=newton1(fn,dfn,x0,e)
ifnargin<4,e=1e-4;end
x=x0;x0=x+2*e;
whileabs(x0-x)>e
x0=x;
x=x0-feval(fn,x0)/feval(dfn,x0);
end
在matlab软件中执行以下语句并得到最终结果截图
>>clear
>>fun=inline('x^3+2*x-0.205061208');
>>dfun=inline('3*x^2+2');formatlong;
>>newton1(fun,dfun,0.5,1e-6),formatshort
并得到最终结果
n=
4
ans=
0.000
割线法求解算法
建立gexianfa.m源程序,源程序代码为:
functionx=gexian(f,x0,x1,e)
ifnargin<4,e=1e-4;end
y=x0;x=x1;
whileabs(x-y)>e
z=x-(feval(f,x)*(x-y))/(feval(f,x)-feval(f,y));
y=x;
x=z;
end
在matlab软件中执行以下语句
>>clear
>>fun=inline('x^3+2*x-0.205061208');
>>gexianfa(fun,0,1,1e-6),formatshort
并得到最终结果:
n=
5
ans=
0.1020
抛物线法求解算法
建立paowuxian.m源程序,源程序代码为:
functionx=pawuxian(f,x0,x1,x2,e)
ifnargin<4,e=1e-4;end
x=x2;y=x1;z=x0;
whileabs(x-y)>e
h1=y-z;
h2=x-y;
c1=(feval(f,y)-feval(f,z))/h1;
c2=(feval(f,x)-feval(f,y))/h2;
d=(c1-c2)/(h2+h1);
w=c2+h2*d;
xi=x-(2*feval(f,x))/(w+(w/abs(w))*sqrt(w^2-4*feval(f,x)*d));
z=y;
y=x;
x=xi;
end
在matlab软件中执行以下语句
>>fun=inline('x^3+2*x-0.205061208');
>>paowuxian(fun,0,0.5,1,1e-6),formatshort
并得到最终结果
n=
7
ans=
0.1020
第一题〔2〕
根据要求,待求解的方程应为:
。
仍然利用〔1〕中方法求解这一问题,并利用图解法找到初值,通过观察图像,将newton法初值设为:
0.2,割线法初值设为:
0,0.2。
抛物线法初值设为:
0,0.1,0.2。
图像见以下图:
Newton法求解:
在matlab软件中执行以下语句
>>clear
>>fun=inline('sin(x)+2*x-0.205061208');
>>dfun=inline('cos(x)+2');formatlong;
>>newton1(fun,dfun,0.2,1e-6),formatshort
并得到最终结果
n=
3
ans=
0.510
割线法求解:
在matlab软件中执行以下语句
>>clear
>>fun=inline('sin(x)+2*x-0.205061208');
>>gexianfa(fun,0,0.2,1e-6),formatshort
并得到最终结果截图
n=
3
ans=
0.0684
抛物线法求解
在matlab软件中执行以下语句并得到最终结果截图
>>clear
>>fun=inline('sin(x)+2*x-0.205061208');
>>paowuxian(fun,0,0.1,0.2,1e-6),formatshort
并得到最终结果
n=
3
ans=
0.0684
问题一〔3〕
按照题目要求对五次方程进展构造为:
仍然利用〔1〕中方法求解这一问题,并利用图解法找到初值,通过观察图像,将newton法初值设为:
在此处我们选取了两组初值为0以及0.5,割线法初值设为:
-1,1。
抛物线法初值设为:
两组初值为-1,0,1以及0,0.5,1。
Newton法:
在matlab软件中执行以下语句
>>clear
>>fun=inline('(x^3+2*x-0.205061208)*(x-0.102)^2');
>>dfun=diff('(x^3+2*x-0.205061208)*(x-0.102)^2')
dfun=
(3*x^2+2)*(x-.102)^2+2*(x^3+2*x-.205061208)*(x-.102)
>>dfun=inline('(3*x^2+2)*(x-.102)^2+2*(x^3+2*x-.205061208)*(x-.102)');formatlong;
>>newton1(fun,dfun,0,1e-6),formatshort
并得到最终结果:
n=
27
ans=
0.764
>>newton1(fun,dfun,0.5,1e-6),formatshort
n=
31
ans=
0.1020
割线法:
在matlab软件中执行以下语句
>>clear
>>fun=inline('(x^3+2*x-0.205061208)*(x-0.102)^2');
>>gexianfa(fun,-1,1,1e-6),formatshort
并得到最终结果:
n=
41
ans=
0.1020
抛物线法:
在matlab软件中执行以下语句
>>clear
>>fun=inline('(x^3+2*x-0.205061208)*(x-0.102)^2');
>>paowuxian(fun,0,0.5,1,1e-6),formatshort
并得到最终结果截图:
n=
57
ans=
0.1020
问题一〔4〕
按照题目要求对方程进展构造
仍然利用〔1〕中方法求解这一问题,并利用图解法找到初值,通过观察图像,可知存在重根,故将newton法初值设为:
两组初值为0以及0.5,割线法初值设为:
两组初值为0,0.1以及-0.1,0.1。
抛物线法初值设为:
两组初值为-1,0,1以及0,0.5,1。
绘图语句为:
>>fun=inline('(sin(x)+2*x-0.205061208)*(x-0.102)');fplot(fun,[-1,1])
Newton法:
在matlab软件中执行以下语句
>>clear
>>fun=inline('(sin(x)+2*x-0.205061208)*(x-0.102)');fplot(fun,[-1,1]);
>>dfun=diff('(sin(x)+2*x-0.205061208)*(x-0.102)')
dfun=
(cos(x)+2)*(x-.102)+sin(x)+2*x-.205061208
>>dfun=inline('(cos(x)+2)*(x-.102)+sin(x)+2*x-.205061208');formatlong;
>>newton1(fun,dfun,0,1e-6),formatshort
并得到最终截图:
n=
6
ans=
0.484
>>newton1(fun,dfun,0.5,1e-6),formatshort
并得到最终结果:
n=
8
ans=
0.1020
割线法:
在matlab软件中执行以下语句
>>clear
>>fun=inline('(sin(x)+2*x-0.205061208)*(x-0.102)');
>>gexianfa(fun,0,1,1e-6),formatshort
并得到最终结果:
n=
10
ans=
0.0684
>>gexianfa(fun,0,0.1,1e-6),formatshort
并得到最终结果:
n=
5
ans=
0.1020
抛物线法:
在matlab软件中执行以下语句
>>clear
>>fun=inline('(sin(x)+2*x-0.205061208)*(x-0.102)');
>>paowuxian(fun,-0.1,0,0.05,1e-6),formatshort
并得到最终结果:
n=
8
ans=
0.0684
>>paowuxian(fun,0,0.5,1,1e-6),formatshort
并得到最终结果:
n=
15
ans=
0.1020
〔五〕计算结果
Newton法
割线法
抛物线法
问题一〔1〕
0.102
0.102
0.102
问题一〔2〕
0.5510
0.0684
0.0684
问题一〔3〕
0.102
0.102
0.102
问题一〔4〕
0.102和
0.4
0.102和
0.0684
0.102和
0.0684
〔1〕迭代步数
〔2〕迭代步数
〔3〕迭代步数
〔4〕迭代步数
Newton法
4
3
31
6,8
割线法
5
3
41
10,5
抛物线法
7
3
57
8,15
〔六〕结果分析
将Newton法,割线法,抛物线法进展比拟可以看到在本文题中,三种方法计算得到的最终结果根本一样,但是迭代步数有较大差异,综合看来Newton法迭代步数最少,割线法次之,抛物线法最次。
这与算法设计中所说Newton法收敛最快,割线法次之,抛物线法最次很好的贴合。
对每个算法单独来看,显然选择初值不同对于迭代步数影响较大,对于找到根也会有影响。
因此应该先通过画图确定根的大致位置,给出在其附近的初值。
〔七〕心得体会
在实现这三个算法的过程中,本身编程较易实现,最重要的是对算法本身的理解,只有真正理解算法的含义才能更快更好的实现程序。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- matlab 实现 Newton 割线 抛物线