在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
题目:用牛顿法求方程x-cos(x)=0的实根(精确到1E-6)。 (1)要求用函数调用。 (2)进一步研究和弦截法作比较。 算法分析: (1) 此题是利用牛顿方法解一元非线性方程的根。(牛顿法是把非线性方程局部线性化的一种方法,它在单根附近具有较高的收敛速度。)所以首先我们应先给出估计的根,先对方程x-cos(x)=0变形,令y1=x,y2=cos(x),则两函数图象的交点,就是方程x-cos(x)=0的根,这里利用Matlab作图估计根的值。 在Matlab命令行中输入,并运行: >>x=-2:0.01:2; >>y1=cos(x); >>y2=x; >>plot(x,y1,x,y2); >>grid on; 可得下图: 从图中可以很容易得到根x的初值可选0.6。 (2)利用牛顿法的迭代公式x1=x0-(f(x0)/f’(x0));这里首先取x0=0.6,代入迭代公式,然后判断x1与x0之差的绝对值是否小于精度,如果小于精度,则停止,即得出根x的值,如果不小于精度,则继续迭代,直到符合精度为止。Matlab代码如下: (1)funNewton.m函数文件为: %此文件为被调函数文件。
function[y,dirv_y]=funNewton(x)
%y与dirv_y为函数返回的参数,x为调用时的传递参数。
y=x-cos(x);
dirv_y=1+sin(x);
%dirv_y为y的一阶导函数 (2)Newton.m脚本文件为: clear all
%清除所有变量
Error=1e-6;
%根所要求的误差精度
formatlong
%格式化此行一下的变量。
x=0.6;
fork=1:20
%迭代次数20次
[y,dirv_y]=funNewton(x);
%调用函数文件
xk=x;
%xk可保留前一次x的值。
x=x-y/dirv_y;
%牛顿法的核心,即此迭代公式。
if(abs(xk-x)<=Error)
%判断当此x的值与前一次x的值即xk的差值,即误差是否小于题目给定的误差。
break;
end
end
x
%输出根x的值。 在Matlab的命令行中输入(因为我的程序文件保存为:Newton.m脚本文件,funNewton.m函数文件): >>Newton x=0.739085133215161 结果分析: 在Matlab的命令行中输入: >>format long >>fzero(\'x-cos(x)\',0) ans=0.739085133215161 经比较可知:牛顿法的结果有一定的误差,但是牛顿方法由于在单根附近有良好的收敛性,所以与其他方法得出的结果相比误差较小。但是牛顿方法有个缺点:它只在根附近局部收敛。所以所我们在给定X的初值时尤为重要,如果给的初值离真值过远。那么用牛顿法可能永远也找不到此方程的解。对于这种情况,我们可以先利用工具软件(如:Matlab)画出草图,确定根的大致位置。牛顿法的每一步迭代都要计算一次导数值,而在计算机中,计算一次导数的近似值比计算函数值要麻烦的多。所以我们可以用弦截法,其迭代公式为:x2=x1-((x1-x0)/f(x1)-f(x0))*f(x1). 当f(x)在x*的某一个邻域内具有二阶连续导数,且f’(x)!=0,初值x0,x1落在此邻域内,弦截 法是收敛的。此文为本人原创!如需使用,请注明出处! |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论