二分法(Bisection)与牛顿法(Newton)求方程的根

本文探讨了两种常见的数值求根方法——二分法和牛顿法。二分法依赖于已知根所在的区间,虽然速度较慢但不需要求导,而牛顿法则利用切线原理,速度快但需要函数连续可导且选择合适的初始值。通过MATLAB程序实现,二分法求解结果误差极小,而牛顿法的收敛性受初始值影响,选取不当可能导致发散。总结来说,两种方法各有优缺点,适用于不同的场景。
摘要由CSDN通过智能技术生成

二分法(Bisection)与牛顿法(Newton)求方程的根

二分法求根

  1. 二分法数学原理
    使用前提:必须要知道根所在的区间
    函数图像如下:
    f(x)的图像
    数学分析步骤及编程思想:
    第一步:给出一个会使函数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的时候,停止二等分。输出结果.
  2. 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,可忽略不计,达到求根的要求。

牛顿法求根

  1. 牛顿法数学原理(切线原理)

使用前提:函数f(x)连续且可导。
数形结合:
牛顿法的切线图像
分析及编程步骤:
**第一步:**被求根的方程必须是,连续且可导的函数;然后给出一个初始值x0,同时求出该点的导数f’(x0),并给出一个精确度e。
**第二步:**求点(x0,f(x0))的切线相交于x轴的某个点x1

第三步:
公式不好打,直接上图

  1. 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.
    当没有一个合适的初始值时,正好切线切在边缘点上,会使求出来的根发散。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值