二分法(Bisection)与牛顿法(Newton)求方程的根
二分法求根
- 二分法数学原理
使用前提:必须要知道根所在的区间
函数图像如下:
数学分析步骤及编程思想:
第一步:给出一个会使函数f连续的闭区间[a b]和精确度e,并且f(a)*f(b)<0(代表有根存在于区间内)
第二步:令r=(a+b)/2,同时求出f®,if来判断f®*f(a)<0,若小于0的话,将上限b=r;若大于0的话,将下限a=r。从而达到缩小求根区间的目的。
第三步:判断新的闭区间的范围和e的关系,当闭区间长度>e的时候,返回第二步计算r1。
当闭区间长度<e的时候,停止二等分。输出结果. - matlab程序求解
- 计算函数值的程序1:
function y=myfunction(x)
y=sin(x)+x+1;
end
- 主程序2:
function dimy()
x1=input('请输入区间的下限,x1=');
x2=input('请输入区间的下限,x2=');
e=input('请输入求根的精确度,e=');
f1=myfunction(x1);
f2=myfunction(x2);
if f1*f2>0
disp('根不在区间内,请重新输入')
return
else
y=myroot(x1,x2,e);
disp(['函数的根=',num2str(y)]);
end
end
- 二分法的实施程序3:
function y=myroot(x1,x2,e)
r=(x1+x2)/2;
f3=myfunction(r);
f1=myfunction(x1);
if f3*f1>0
m=x2-r;
if m<e
y=r;
else
x1=r;
y=myroot(x1,x2,e);
end
else
m=r-x1;
if m<e
y=r;
else
x2=r;
y=myroot(x1,x2,e);
end
end
end
- 实现结果
3.误差对比分析
- 检验:
- 结论:
利用二分法求出来的根与自带求解函数求到的根的误差为0.001,可忽略不计,达到求根的要求。
牛顿法求根
- 牛顿法数学原理(切线原理)
使用前提:函数f(x)连续且可导。
数形结合:
分析及编程步骤:
**第一步:**被求根的方程必须是,连续且可导的函数;然后给出一个初始值x0,同时求出该点的导数f’(x0),并给出一个精确度e。
**第二步:**求点(x0,f(x0))的切线相交于x轴的某个点x1
第三步:
- matlab程序求解
主要分为三个程序,一个是计算数值微分的程序,还有一个是计算函数值的程序,将这两个程序嵌套在主程序之中。
- 计算函数值的程序1:
function y=myfunction(x)
y=sin(x)+x-1;
end
- 牛顿法迭代的主程序2:
function newton()
x0=input('请输入一个函数可导的点的值x0=');
e=input('请输入一个你想要的求根精度e=');
k0=input('请输入一个你想要的迭代次数k0=');
k=1;
format short
while k<k0
x1=x0-myfunction(x0)/fdiff(x0);
if abs(x1-x0)>e %方法1:利用x1与x0相差的大小的绝对值和精确度的大小关系来求根
% if myfunction(x0)>e %方法2:利用f(x0)与精确度的大小关系来求根
x0=x1;
k=k+1;
else
break;
end
end
disp('牛顿法求出来的根等于='),disp(vpa(x1))
disp('牛顿法迭代次数='),disp(k)
end
- 计算微分的程序3:
function q=fdiff(x0)
syms x
y=sin(x)+x-1;
f=diff(y);
q=subs(f,x,x0);
end
实现结果:
3.注意事项
由于牛顿迭代法是自己随意选取的初始值,但是最后求出来的根是否是收敛的还是取决于,初始值的选取,就比如,我在选初始值x0=3的时候,算出来的根严重发散,这个时候不要纠结是否是程序有误,而是考虑一下是否是选取了不好的初始值,才导致这种发散的情况。
- 当我选取x0=1的时候,结果如下:
发现得到的根是没有错误的,说明选取的初始值没有什么问题。 - 当我选取x0=3的时候,结果如下:
这里我只迭代10次,因为100次电脑会死机,当选取的初始值会使函数发散的时候。由此我发现得到的根是有错误的,说明选取的初始值有问题,使得到的根是一个发散的状态。
总结:切记牛顿法的初始值不是随意选取的。
方法对照
- 二分法求根的优缺点
优点:可靠性高,并且不需要求微分。
缺点:速度慢,需要提前知道一个包含根的区间。
- 牛顿法求根的优缺点
优点:快速
缺点:需要求微分,需要提供一个合适的初始值x0.
当没有一个合适的初始值时,正好切线切在边缘点上,会使求出来的根发散。