当前位置:首页 > > 小麦大叔
[导读]前面刚转了一篇文章提到了牛顿-拉夫逊(拉弗森)(Newton-Raphson method)方法,感觉这个数学方法很有必要相对深入写一篇文章来总结分享印证一下自己的理解。

关注、星标 嵌入式客栈 ,精彩及时送达

[导读] 前面刚转了一篇文章提到了牛顿-拉夫逊(拉弗森)(Newton-Raphson method)方法,感觉这个数学方法很有必要相对深入写一篇文章来总结分享印证一下自己的理解。这是写本文的由来,如果发现文章中有错误之处,请留言交流讨论。

什么是牛顿-拉夫逊方法?

牛顿其人:Isaac Newton(1642年12月25日– 1727年3月20日)是一位英国数学家,物理学家,天文学家,神学家和作家,被公认为有史以来最有影响力的科学家之一,并且是科学革命的关键人物。他的书《自然哲学的数学原理》于1687年首次出版,奠定了古典力学的基础。牛顿还为光学做出了开创性的贡献,并与戈特弗里德·威廉·莱布尼兹(Gottfried Wilhelm Leibniz)发展了无穷微积分的学科。


牛顿

拉弗森Joseph Raphson 生卒不详,其最著名的著作是1690年出版的《通用分析方程》。它包含一种方法,现在称其为牛顿-拉夫森方法,用于近似方程式的求根。艾萨克·牛顿(Isaac Newton)在1671年写的《通量法》中开发了一个非常相似的公式,但是这项工作要到1736年才出版,这是拉夫森分析之后近50年。但是,该方法的Raphson版本比Newton方法更简单,因此通常被认为是更好的方法。

所以,牛顿迭代法(简写)就是一种近似求解实数域与复数域求解方程的数学方法。那么这个方法是具体是什么原理呢?

牛顿迭代如何迭代?

直接看数学公式描述如何迭代不直观,先来看动图就很容易理解牛顿迭代法为什么叫迭代法以及怎样迭代的:

牛顿迭代法是原理是根据一个初始点 在该点做切线,切线与X轴相交得出下一个迭代点 的坐标,再在 处做切线,依次类推,直到求得满足精度的近似解为止。


由前面描述知道,牛顿迭代法是用来近似求解方程的,这里有两个点需要说明:

  • 为啥要近似求解?很多方程可能无法直接求取其解
  • 迭代法非常适合计算机编程实现,实际上计算机编程对于牛顿迭代法广为应用

来看看,数学上如何描述的?

其中 为函数 处的一阶导数,也就是该点的切线。

来简单推一推上面公式的由来,直线函数方程为:

知道一个直线的一个坐标点 以及斜率 则该直线的方程就很容易可以得知:

那么该直线与 轴的交点,就是 也即等式 的解:

啥时候停止迭代呢?

  1. 计算出

  2. 给出一个初始假定根值 ,利用上面迭代式子进行迭代

  3. 计算绝对相对迭代近似误差

  4. 将绝对相对近似误差与预定的相对误差容限 进行比较。如果 ,则迭代步骤2,否则停止算法。另外,检查迭代次数是否已超过允许的最大迭代次数。如果是这样,则需要终止算法并退出。另一个终止条件是:

如何编码呢?

由于牛顿迭代法主要目的是解方程,当然也有可能用于某一个数学函数求极值,所以无法写出通用的代码,这里仅仅给出一个编代码的思路。相信掌握了思路,对于各种实际应用应该能很快的写出符合实际应用的代码。

假定一函数为

其波形图如下:

其一阶导数为:

那么对于该函数的根:

从图上大致可以知道有两个根,如果直接解方程,则很难求出其根,可以编个代码试试:

#include 
#include 
#include 

/*假定待求根函数如下*/
#define    F(x)    (2*(x)*(x)-10*cos(x)+(x)-80)

/*其一阶导数为*/
#define   DF(x)    (4*(x)+10*sin(x)+1)

float newton_rooting(float x0,float precision,float min_deltax,int max_iterations)
{
     float xn,xn1,fn,fn1,dfn;
     float deltax;
     int step = 0;
     xn  = x0;
     xn1 = x0;
     do{
       xn  = xn1;
       fn  = F(xn);
       dfn = DF(xn);
       /*判0*/
       iffabs(dfn) <1e-6 )
       {
            iffabs(fn)>precision )
                return NAN;
            else
                return fn;
       }

       xn1 = xn - fn/dfn;
       fn1 = F(xn1);
       deltax = fabs(xn1-xn);
       
       step++;
       if( step>max_iterations )
       {
           iffabs(fn1)               return xn;
           else
               return NAN;
       }
     }
     whilefabs(fn1)>precision || deltax>min_deltax );

     return xn1;
}

void main()
{
     float root_guess = 23.0f;
     float precision = 0.00001f;
     float min_deltax = 0.001f;
     float root;
     int step = 7;

     root = newton_rooting( root_guess,precision,min_deltax,step );
     printf("根为: %f,函数值为:%f\n", root,F(root));

     root_guess = -23;
     root = newton_rooting( root_guess,precision,min_deltax,step );
     printf("根为: %f,函数值为:%f\n", root,F(root));
}

结果:

根为: 6.457232, 函数值为:0.000004
根为: -6.894969,函数值为:-0.000008

函数值已经很接近于0了,如果还需要更为精确的值,则可以选择在此基础上进一步求解,比如利用二分法逼近。

需要注意些啥?

  • 求斜率可能为0,如为0时,则可能找到了函数的极值,比如:

  • 如果选择的初始猜测根的接近方程f(x)=0中函数f(x)的拐点 ,Newton-Raphson方法可能开始偏离根。然后,它可能会又收敛回到根。例如

5435866

  • 如果选择的初值不合适,可能会跳掉一些根,比如:

所以实际应用时,需要知道自己待求解模型的大致情况,在合理的加以调整。

有哪些应用?

  • 比如知道某系统的传递函数,求解传函的参数,可以将上述方法推而广之,求解多维变量方程组,求导就变成求偏导了
  • 又比如设计一电路测量某物质的阻抗
  • ....

总结一下

牛顿迭代法在解决实际问题时,利用迭代求方程近似根的数学原理,在工程中有着很好的实用价值。比如求一个趋势的极值,传递函数参数辨识等都有广泛的实际应用。本文抛砖引玉,有可能文章也有很多错误疏漏的地方,如有不同看法或者发现错误,欢迎留言交流指正。

END
往期精彩推荐,点击即可阅读




▲Linux驱动相关专辑  
手把手教信号处理专辑
片机相关专辑

免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭