牛顿迭代法及应用

作者:faaronzheng 转载请注明出处!

今天遇到一个题,不用库函数求立方根。网上有很多介绍了,就是使用牛顿迭代法进行近似计算。下面自己总结一下。


下面首先介绍一下牛顿迭代法:牛顿迭代法的核心思想是使用泰勒级数的线性项近似计算函数f(x)=0的根。把f(x)在点 x0 x 0 的某邻域内展开成泰勒级数,取其线性部分(即泰勒展开的前两项),并令其等于0,
f(x)+f(x0)(xx0)=0 f ( x ) + f ′ ( x 0 ) ( x − x 0 ) = 0 ,以此作为非线性方程 f(x)=0的近似方程,即切线方程(p.s. 其实就是两点式直线方程y- y0 y 0 =k(x- x0 x 0 )),若 f(x)0 f ′ ( x ) ≠ 0 ,则其解为 x=x0f(x)f(x) x = x 0 − f ( x ) f ′ ( x ) , j将其推广,得到牛顿迭代法的一个迭代关系式 xn+1=xnf(xn)f(xn) x n + 1 = x n − f ( x n ) f ′ ( x n )

通俗的讲,这个迭代过程先随机先一个初始点 x0 x 0 ,过( x0 x 0 ,f( x0 x 0 ))做函数的切线,将切线和横坐标的切点做下一个点继续做切线,知道切线和函数的切点落在横坐标上。下面的动画可以形象的展示这一过程。
这里写图片描述


接下来我们的目标就是构造出f(x)=0,以求立方根为例,我们只要令
f(x)= x3n x 3 − n 就可以。剩下的就是将上面的想法编码实现:

public double f(double x, double num) // 函数
{
    return x*x*x-num;
}

public double _f(double x)  // 导函数
{
    return 3*x*x;
}

public double getCubeRoot(double input)
{
    double x=1;
    do
    {
        x = x - f(x,input)/_f(x);
    } while(f(x,input) > 0.00001 || f(x,input) < -0.00001);

    return x;
}
  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
牛顿迭代法是一种求解非线性方程的常用数值方法,可以用于解决各种实际问题。以下是几个利用Matlab实现牛顿迭代法解决实际问题的例子: 1. 解决方程组 假设有如下方程组: x^2 + y^2 = 25 x^2 - y^2 = 7 可以将其转化为非线性方程组的形式: f1(x,y) = x^2 + y^2 - 25 = 0 f2(x,y) = x^2 - y^2 - 7 = 0 然后使用牛顿迭代法求解,具体的Matlab代码如下: syms x y; f1 = x^2 + y^2 - 25; f2 = x^2 - y^2 - 7; J = jacobian([f1,f2],[x,y]); invJ = inv(J); x0 = [1;1]; tol = 1e-6; maxit = 100; for k = 1:maxit f = [subs(f1,[x,y],x0'), subs(f2,[x,y],x0')]; delta = -invJ*double(f'); x1 = x0 + delta; if norm(x1-x0) < tol break; end x0 = x1; end x1, k 其中,syms x y;定义了x和y为符号变量,f1和f2是方程组的表达式,J是雅可比矩阵,invJ是雅可比矩阵的逆矩阵,x0是初始值,tol是迭代的精度要求,maxit是最大迭代次数,k是迭代次数计数器。 2. 拟合曲线 假设有一组数据点(x,y),要求拟合出一条曲线y=f(x),可以将其转化为非线性方程组的形式: f(x) - y = 0 其中,f(x)是拟合曲线的表达式。然后使用牛顿迭代法求解,具体的Matlab代码如下: x = [1,2,3,4,5,6,7]; y = [1.2,1.5,2.1,2.5,2.8,3.6,4.2]; syms a b c; f = a*x.^2 + b*x + c; J = jacobian(f,[a,b,c]); invJ = inv(J); p0 = [0,0,0]; tol = 1e-6; maxit = 100; for k = 1:maxit fval = double(subs(f,[a,b,c],p0') - y'); delta = -invJ*double(fval); p1 = p0 + delta'; if norm(p1-p0) < tol break; end p0 = p1; end p1, k 其中,x和y是数据点的坐标,syms a b c;定义了a、b和c为符号变量,f是拟合曲线的表达式,J是雅可比矩阵,invJ是雅可比矩阵的逆矩阵,p0是初始值,tol是迭代的精度要求,maxit是最大迭代次数,k是迭代次数计数器。 3. 求解微分方程 假设要求解如下微分方程: y'' + y' + y = sin(x), y(0) = 0, y'(0) = 0 可以将其转化为非线性方程组的形式: f1(y,y',x) = y' = z f2(y,z,x) = z' = sin(x) - y - z 然后使用牛顿迭代法求解,具体的Matlab代码如下: syms y z x; f1 = z; f2 = sin(x) - y - z; J = jacobian([f1,f2],[y,z]); invJ = inv(J); y0 = 0; z0 = 0; tol = 1e-6; maxit = 100; for k = 1:maxit f = [subs(f1,[y,z,x],[y0,z0,x]), subs(f2,[y,z,x],[y0,z0,x])]; delta = -invJ*double(f'); y1 = y0 + delta(1); z1 = z0 + delta(2); if norm([y1,z1]-[y0,z0]) < tol break; end y0 = y1; z0 = z1; end y1, k 其中,syms y z x;定义了y、z和x为符号变量,f1和f2是微分方程的表达式,J是雅可比矩阵,invJ是雅可比矩阵的逆矩阵,y0和z0是初始值,tol是迭代的精度要求,maxit是最大迭代次数,k是迭代次数计数器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值