前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >牛顿法(Newton Method)求解f(x)=0

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

原创
作者头像
黑豆梨
修改2018-06-16 11:04:43
3.1K0
修改2018-06-16 11:04:43
举报

今天继续探讨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

求解代码如下

代码语言:txt
复制
#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)}

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

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档