matlab实现Newton法-割线法-抛物线法.docx
- 文档编号:244185
- 上传时间:2022-10-07
- 格式:DOCX
- 页数:15
- 大小:61.01KB
matlab实现Newton法-割线法-抛物线法.docx
《matlab实现Newton法-割线法-抛物线法.docx》由会员分享,可在线阅读,更多相关《matlab实现Newton法-割线法-抛物线法.docx(15页珍藏版)》请在冰豆网上搜索。
(一)实验目的:
熟悉和掌握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法迭代格式为:
xk+1=xk-f(xk)f'(xk+1)
当初值x0与真解足够靠近,newton迭代法收敛,对于单根,newton收敛速度很快,对于重根,收敛较慢。
2.割线法:
为了回避导数值f'(xk)的计算,使用xk,xk-1上的差商代替f'(xk),得到割线法迭代公式:
xk+1=xk-xk-xk-1fxk-fxk-1f(xk)
割线法的收敛阶虽然低于newton法,但迭代以此只需计算一次f(xk)函数值,不需计算其导数,所以效率高,实际问题中经常应用。
3.抛物线法:
可以通过三点做一条抛物线,产生迭代序列的方法称为抛物线法。
其迭代公式为:
xk+1=xk-2f(xk)ωk+sgn(ωk)ωk2-4fxkf[xk,xk-1,xk-2]
其中ωk=fxk,xk-1+(xk-xk-1)f[xk,xk-1,xk-2]
收敛速度比割线法更接近于newton法。
对于本问题的解决就以上述理论为依据。
终止准则为:
|pn-pn-1|<ε
本题中所有ε取1e-6。
(四)程序
注:
n表示迭代步数。
第一题
(1)首先根据题目要求对方程进行构造,得到的方程为:
y=x3+2x-0.205061208。
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.10200000000000
割线法求解算法
建立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)
根据要求,待求解的方程应为:
y=sinx+2x-0.205061208。
仍然利用
(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.06837148815510
割线法求解:
在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)
按照题目要求对五次方程进行构造为:
y=x3+2x-0.205061208*(x-0.102)2
仍然利用
(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.10199821300764
>>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.06837148815484
>>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=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- matlab 实现 Newton 割线 抛物线
![提示](https://static.bdocx.com/images/bang_tan.gif)