0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

牛顿-拉夫逊迭代法原理及其实现

FPGA之家 来源:嵌入式客栈 2023-04-17 09:04 次阅读

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

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

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

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

牛顿迭代如何迭代?

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

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


5ce5016a-dcb3-11ed-bfe3-dac502259ad0.gif

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

为啥要近似求解?很多方程可能无法直接求取其解

迭代法非常适合计算机编程实现,实际上计算机编程对于牛顿迭代法广为应用

poYBAGQ8m0KAEZdCAAEU5ezeya8538.jpg

啥时候停止迭代呢?

poYBAGQ8m1aAb75xAAEZTVA4qHM824.jpg

如何编码呢?

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

假定一函数为

poYBAGQ8m2aAIPehAAAUGDgmIoM702.jpg

其波形图如下:

5d159f14-dcb3-11ed-bfe3-dac502259ad0.png

pYYBAGQ8m3mAHD7zAAA-OqvFRzg419.jpg

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

#include
#include
#include

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

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

floatnewton_rooting(floatx0,floatprecision,floatmin_deltax,intmax_iterations)
{
floatxn,xn1,fn,fn1,dfn;
floatdeltax;
intstep=0;
xn=x0;
xn1=x0;
do{
xn=xn1;
fn=F(xn);
dfn=DF(xn);
/*判0*/
if(fabs(dfn)<1e-6 )
       {
            if( fabs(fn)>precision)
returnNAN;
else
returnfn;
}

xn1=xn-fn/dfn;
fn1=F(xn1);
deltax=fabs(xn1-xn);

step++;
if(step>max_iterations)
{
if(fabs(fn1)precision||deltax>min_deltax);

returnxn1;
}

voidmain()
{
floatroot_guess=23.0f;
floatprecision=0.00001f;
floatmin_deltax=0.001f;
floatroot;
intstep=7;

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

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

结果:

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

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

需要注意些啥?

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

5d301ca4-dcb3-11ed-bfe3-dac502259ad0.png

poYBAGQ8m5KAeYV_AABuBKWqcT0512.jpg

5d494008-dcb3-11ed-bfe3-dac502259ad0.png

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

5d69f9d8-dcb3-11ed-bfe3-dac502259ad0.png

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

有哪些应用?

比如知道某系统的传递函数,求解传函的参数,可以将上述方法推而广之,求解多维变量方程组,求导就变成求偏导了

又比如设计一电路测量某物质的阻抗

....

总结一下

牛顿迭代法在解决实际问题时,利用迭代求方程近似根的数学原理,在工程中有着很好的实用价值。比如求一个趋势的极值,传递函数参数辨识等都有广泛的实际应用。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 计算机
    +关注

    关注

    19

    文章

    6842

    浏览量

    85714

原文标题:数学之美:牛顿-拉夫逊迭代法原理及其实现

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    用matlab实现牛顿迭代法,怎么确定有效数字?

    迭代过程中只是限制了 x(k+1)-x(k)不超过设置好的误差限(比如0.000001)但怎么保证有效数字的位数呢?
    发表于 10-20 16:00

    matlab牛顿迭代法全解

    理论本质上是立足于对世界的这种认识:很多物理规律在微观上是线性的。近几百年来,这种局部线性化方法取得了辉煌成功,大到行星轨道计算,小到机械部件设计。牛顿迭代法正是将局部线性化的方法用于求解方程。一、牛顿
    发表于 03-08 16:22

    问题:matlab实现牛顿迭代法求解非线性方程

    "matlab实现牛顿迭代法求解非线性方程"。通过试着运行作者的matlab code,产生了如下一些疑问,请各位老师帮忙解答,不胜感谢。clearclcsyms x1 x2 x3
    发表于 07-05 02:53

    迭代法求值

    X(n+1)=a/(b+Xn),其中a,b为正的常数迭代的终止条件为|Xn+1-Xn|
    发表于 06-06 02:02

    基于牛顿迭代法的FPGA定点小数计算

    倒数运算分为这两个步骤则需要更多的时间开销和空间开销。而采用常规的浮点运算单元(FPU)来求解的话,同样需要很长的计算时间。本文介绍一种基于牛顿迭代法(又称Newton-Raphson算法)的平方根
    发表于 07-18 07:33

    从梯度下降法、牛顿到拟牛顿它们的联系与区别是什么

    从梯度下降法、牛顿到拟牛顿,浅谈它们的联系与区别
    发表于 05-21 11:06

    基于Matpower的电力系统潮流计算设计原理是什么

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档基于Matlab的8机28节点电力系统潮流计算设计前言一、牛顿-拉夫算法潮流计算的基本原理1.牛顿-
    发表于 06-30 07:44

    参数寻优的迭代法的基本原理是什么?伺服控制系统常用参数寻优算法是什么?

    参数寻优的迭代法的基本原理是什么?伺服控制系统常用参数寻优算法是什么?
    发表于 10-13 06:38

    迭代法迭代阵谱半径新上界

    引用双严格对角占优的概念,针对线性方程组bAx=在求数值解时常用的迭代方法,给出了Jacobi和Gauss-Seidel迭代法迭代阵谱半径的新上界,该新上界优于严格对角占优矩阵条件下得到
    发表于 11-18 00:07 6次下载

    迭代法求指纹图像中的阀值

    摘要:给出使用直方图方法求阀值的例子;结合直方图方法提出用于计算最优阀值的迭代法,该方法是基于256级的指纹灰度图像计算;最后给出迭代法中初值的选择
    发表于 03-24 12:47 1066次阅读
    用<b class='flag-5'>迭代法</b>求指纹图像中的阀值

    高斯-牛顿迭代法简介

    高斯牛顿迭代法简介,包括高斯牛顿迭代法推演及及结论
    发表于 01-08 16:21 0次下载

    简单潮流计算的牛顿拉夫逊程序

    本文档内容介绍了基于简单潮流计算的牛顿拉夫逊程序,供参考
    发表于 03-05 15:12 9次下载

    牛顿拉夫迭代法的原理解析

    Isaac Newton(1642年12月25日– 1727年3月20日)是一位英国数学家,物理学家,天文学家,神学家和作家,被公认为有史以来最有影响力的科学家之一,并且是科学革命的关键人物。
    的头像 发表于 10-13 10:00 1.1w次阅读

    牛顿迭代如何迭代

    牛顿迭代法是原理是根据一个初始点在该点做切线,切线与X轴相交得出下一个迭代点的坐标,再在处做切线,依次类推,直到求得满足精度的近似解为止。
    的头像 发表于 03-09 10:52 2563次阅读

    python牛顿迭代法

    牛顿迭代法是一种数值计算方法,用于求解方程的数值近似解。它是以英国科学家艾萨克·牛顿的名字命名的,最初由牛顿在17世纪末提出。牛顿
    的头像 发表于 11-21 15:06 641次阅读