牛顿法(Newton Method)求解f(x)=0

今天继续探讨f(x)=0的解法,这次要介绍的是牛顿迭代法。

问题描述

已知f(x)=0,求使等式成立的x的值。

解法如下

求出f(x)的导函数f\_d(x)=f'(x)

任取初值x_0进行迭代

x_1=x_0-f(x_0)/f'(x_0)

x_2=x_1-f(x_1)/f'(x_1)

x_3=x_2-f(x_2)/f'(x_2)

...

x_n=x_{n-1}-f(x_{n-1})/f'(x_{n-1})

直到 f(x_n)≈0 (此处约等于的意思是两者的差值小于预设误差)

示例

求解 f(x)=e^{-x}-x=0

根据求导公式有 f\_d(x)=f'(x)=-e^{-x}-1

求解代码如下

#include <math.h>
#include <stdio.h>

double f(double x)
{
    return exp(-x)-x;
}

double f_d(double x)
{
    return -exp(-x)-1;
}

int main()
{
    double x = 0;
    while (f(x) > 1e-6) {
        x = x-f(x)/f_d(x);
    }
    printf("solution for function exp(-x)-x=0 is %lf\n", x);
    return 0;
}

求解结果如下:

牛顿迭代法求解结果

原理

我也不懂了……详细的可以参考维基百科

https://en.wikipedia.org/wiki/Newton%27s_method

这里仅解释下浅显的理解,而且对收敛性也不做证明。

根据高等数学里面学到的泰勒展开

f(x)=f(x_0)+(x-x_0)f'(x_0) +\frac{(x-x_0)^2}{2}f''(x_0)+\frac{(x-x_0)^3}{3!}f^{(3)}(x_0)+\frac{(x-x_0)^4}{4!}f^{(4)}(x_0)+...+\frac{(x-x_0)^n}{n!}f^{(n)}(x_0)

约掉二阶及二阶以上的小量(至于详细的证明需要参照维基百科了,因为这里任取的初值实际上不一定是小量,这里仅仅是做一个简单解释),得到

f(x)≈f(x_0)+(x-x_0)f'(x_0)

故而可以推出,当 f(x)=0

x≈x_0-\frac{f(x_0)}{f'(x_0)}

此即为牛顿迭代法中得迭代公式。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏hbbliyong

socket 通信 多线程调用窗体(委托)的几个知识点,记录在案,以备查阅

1.socket 通信传输汉字的方法:Encoding.GetEncoding("GB2312").GetString(Receivebyte) 发送接收都这样...

2737
来自专栏跟着阿笨一起玩NET

使用延迟的FileSystemWatcher来避免重复触发事件

  程序里需要监视某个目录下的文件变化情况: 一旦目录中出现新文件或者旧的文件被覆盖,程序需要读取文件内容并进行处理;但在实际处理中发现当一个文件产生变化时,C...

912
来自专栏码匠的流水账

zuul自定义SimpleHostRoutingFilter

zuul的SimpleHostRoutingFilter主要用来转发不走eureka的proxy,里头是使用httpclient来转发请求的,但是有时候我们需要...

1312
来自专栏田超学前端

【微信小程序】c# 实现获取openid、session_key 服务端

5230
来自专栏菩提树下的杨过

基于sliverlight + wcf的web 文字版IM 示例

演示地址: http://task.24city.com/default.html 预览界面: ? 一、布局 采用Grid布局,5行2列 第一行:为登录/注册信...

3226
来自专栏james大数据架构

CSS好看的按钮

好看的按钮 <style> .btn { BORDER-RIGHT: #7b9ebd 1px solid; PADDING-RIGHT: 2px; BORDE...

2007
来自专栏自由而无用的灵魂的碎碎念

小项目分享---混色器

编写代码的同志们一般懂美术的就少了,偶也是,什么色轮、三维加色等等。虽然看过一些书籍(如内田广由纪的《配色基础原理》),不过还是一知半解的。

973
来自专栏我和未来有约会

Silverlight制作逐帧动画 v2 - part2

Silverlight制作逐帧动画 v2 - part2 在这里完善了一下算法,加入了fps的机制进去。 private string[] ...

1896
来自专栏木宛城主

曾今的代码系列——自己的分页控件+存储过程实现分页

项目里面的测试代码,仅供参考 LoginByAjax <title>Ajax登陆</title> <script src="Scripts/c...

1865
来自专栏张善友的专栏

通过SmtpClient发送Exchange会议邮件

看到C#中调用Outlook API 发起会议 ,这个完全可以用SMTP方式实现的,下面我的项目中使用的代码: 对于.NET而言,从2.0开始,发邮件已经是一件...

1949

扫码关注云+社区