从泰勒展开到牛顿迭代
项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步
1.泰勒公式(Taylor’s Formula)
对于一些复杂的函数,为了方便研究与分析,我们往往希望用一些简单的函数来近似表达。其实这也符合人们对事物的认知规律与认知曲线:有浅入深,由易到难,前面研究的比较容易的部分往往是后面推广结论的特例。在比较简单的函数中,多项式算是最简单的一种了。因为多项表达式只有比较简单的加减乘除四则运算,便能求出函数的值。所以,用多项式表达复杂函数往往是我们的首选。
给出泰勒公式的具体表达式:
如果函数f(x)f(x)f(x)在含有x0x_0x0的某个开区间(a,b)(a,b)(a,b)内具有(n+1)(n+1)(n+1)阶的导数,那么对任一x∈(a,b)x \in (a,b)x∈(a,b),有
f(x)=f(x0)+f′(x0)(x−x0)+f′′(x0)2!(x−x0)2+⋯+f(n)(x0)n!(x−x0)n+Rn(x)f(x) = f(x_0) + f'(x_0)(x-x_0) + \frac{f''(x_0)}{2!}(x-x_0)^2 + \cdots + \frac{f^{(n)}(x_0)}{n!}(x-x_0)^n + R_n(x)f(x)=f(x0)+f′(x0)(x−x0)+2!f′′(x0)(x−x0)2+⋯+n!f(n)(x0)(x−x0)n+Rn(x)
其中 Rn(x)=f(n+1)(ϵ)(n+1)!(x−x0)(n+1)R_n(x) = \frac{f^{(n+1)}(\epsilon)}{(n+1)!}(x-x_0)^{(n+1)}Rn(x)=(n+1)!f(n+1)(ϵ)(x−x0)(n+1)
这里的ϵ\epsilonϵ是介于xxx与x0x_0x0之间的某个值,RnR_nRn被称为拉格朗日余项。
泰勒公式的初衷是用多项式来近似表示函数在某点周围的情况。取最常见的exe^xex为例,在x=0x=0x=0的附近可以用如下多项式近似表示:
ex≈1+x+x22!+x33!+⋯+xnn!e^x \approx 1 + x + \frac{x^2}{2!} + \frac{x^3}{3!} + \cdots + \frac{x^n}{n!}ex≈1+x+2!x2+3!x3+⋯+n!xn
2.麦克劳林级数(Maclaurin)
通过函数在自变量零点的导数求得的泰勒级数又叫麦克劳林级数。以前面提到的exe^xex为例,麦克劳林级数即为
ex≈1+x+x22!+x33!+⋯+xnn!e^x \approx 1 + x + \frac{x^2}{2!} + \frac{x^3}{3!} + \cdots + \frac{x^n}{n!}ex≈1+x+2!x2+3!x3+⋯+n!xn
3.泰勒展开的小结
1.泰勒公式的核心思想就是:用多项式函数取逼近光滑的函数。注意这里光滑很重要,因为泰勒公式里面要求具有(n+1)(n+1)(n+1)阶的导数,如果函数“不光滑”,显然不会满足上面的条件。
2.泰勒公式最常见的应用之一就是用于近似计算。以sin(x)sin(x)sin(x)为例:
sin(x)=x−13!x3+17!x7−19!x9+⋯sin(x) = x - \frac{1}{3!}x^3 + \frac{1}{7!}x^7 - \frac{1}{9!}x^9 + \cdotssin(x)=x−3!1x3+7!1x7−9!1x9+⋯
计算机中计算sin(x)sin(x)sin(x)的值,就可以用上面的公式计算。
4.牛顿法(Newton’s method)
牛顿法(Newton’s method)又称为牛顿-拉弗森方法(Newton-Raphson method)。本博主的master论文里主要的理论依据就是牛顿-拉弗森方法。它是一种在实数域和复数域上近似求解方程的方法。牛顿法使用函数f(x)f(x)f(x)的泰勒级数的前面几项来寻找方程f(x)=0f(x)=0f(x)=0的根。所以他跟泰勒展开有天然的关系。
有前面的泰勒展开
f(x)=f(x0)+f′(x0)(x−x0)+f′′(x0)2!(x−x0)2+⋯+f(n)(x0)n!(x−x0)n+Rn(x)f(x) = f(x_0) + f'(x_0)(x-x_0) + \frac{f''(x_0)}{2!}(x-x_0)^2 + \cdots + \frac{f^{(n)}(x_0)}{n!}(x-x_0)^n + R_n(x)f(x)=f(x0)+f′(x0)(x−x0)+2!f′′(x0)(x−x0)2+⋯+n!f(n)(x0)(x−x0)n+Rn(x)
取泰勒展开的一次项,忽略后面的高次项,有:
f(x)=f(x0)+f′(x0)(x−x0)f(x) = f(x_0) + f'(x_0)(x-x_0)f(x)=f(x0)+f′(x0)(x−x0)
如果我们将得到的新的坐标为xn+1x_{n+1}xn+1,原来的坐标为xnx_nxn,通常xn+1x_{n+1}xn+1比xnx_nxn更接近方程f(x)=0f(x)=0f(x)=0的解。因此利用新的坐标为xn+1x_{n+1}xn+1进行下一轮迭代。
由上面的式子,很容易得出迭代公式为:
xn+1=xn−f(xn)f′(xn)x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}xn+1=xn−f′(xn)f(xn)
用此式迭代,即可得到方程f(x)=0f(x)=0f(x)=0的根。
牛顿迭代的几何意义如下图
5.牛顿迭代实例
http://blog.csdn.net/bitcarmanlee/article/details/52194255 一文中,我们提到用牛顿迭代求解一个数的方根。里面我们给出了迭代公式,但是没有给出具体的推导过程。这里我们就推导一下求解方根迭代公式的过程。
求nnn的方根,即求解x2−n=0x^2-n=0x2−n=0
令f(x)=x2−nf(x) = x^2 - nf(x)=x2−n,则f′(x)=2xf'(x) = 2xf′(x)=2x
根据前面求得的牛顿迭代公式:
x(n+1)=xn−f(x)f′(x)=xn−xn2−n2xn=12(xn+nxn)x_{(n+1)} = x_n - \frac{f(x)}{f'(x)} = x_n - \frac{x_n^2-n}{2x_n} = \frac{1}{2}(x_n + \frac{n}{x_n}) x(n+1)=xn−f′(x)f(x)=xn−2xnxn2−n=21(xn+xnn)
result = 0.5 * (result + (n / result))
这行代码即由上述迭代公司所求得。
从泰勒展开到牛顿迭代相关推荐
- 多项式牛顿迭代(应用:求逆,开根,对数exp)
多项式牛顿迭代 给定多项式g(x)g(x)g(x),求f(x)f(x)f(x),满足g(f(x))≡0(modxn)g(f(x)) \equiv 0 \pmod {x ^ n}g(f(x))≡0(mo ...
- 关于牛顿迭代求根的笔记
关于牛顿迭代求根的笔记 牛顿迭代法(Newton's method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求 ...
- 最优化方法:牛顿迭代法和拟牛顿迭代法
http://blog.csdn.net/pipisorry/article/details/24574293 基础 拐点 若曲线图形在一点由凸转凹,或由凹转凸,则称此点为拐点.直观地说,拐点是使切线 ...
- 梯度下降法,牛顿迭代,牛顿法,拟牛顿法总结对比
1.梯度下降 梯度下降是优化方法中最基础也是最重要的一类.其思想也很简单: f(x)=f(x0)+f′(x0)(x−x0)+⋯f(x) = f(x_0) + f'(x_0)(x-x_0) + \cdo ...
- 【学习笔记】超简单的多项式牛顿迭代(含泰勒展开式、牛顿迭代全套证明)
整理的算法模板合集: ACM模板 目录 泰勒展开式 牛顿迭代 牛顿迭代应用 点我看多项式全家桶(●^◡_◡◡^●) 泰勒展开式 牛顿迭代 牛顿迭代应用 牛顿迭代yyds,只用三行就完成了我一页纸的证 ...
- 【学习笔记】超简单的多项式求指(含泰勒展开式、牛顿迭代完成证明)
整理的算法模板合集: ACM模板 目录 多项式求指 泰勒展开式 牛顿迭代 牛顿迭代应用 P4726 [模板]多项式指数函数(多项式 exp) 数组版 (1.64s) vector版 (960 ms) ...
- 用numpy autograd 实现牛顿迭代
文章目录 1. 导入包库 2.定义函数 3.使用`autograd`定义导数 4.实现牛顿迭代 5.用`scipy`对应方法检验结果 6.小结 考虑非线性方程: f(x)=sin(x)−e−x=0f ...
- 说说牛顿迭代 -- 方法篇
说说牛顿迭代 – 方法篇 写这个笔记主要是最近老在考虑最优化问题.今天刚好发现一个不错的手写公式的工具,加上前几天又发现Win10的Windows Ink比我想象得好用,于是来描几笔.主要是想试试这样 ...
- 求平方根的算法 牛顿迭代法和二分法
牛顿法: public double sqr(double n){double x=n,y=0.0;while (Math.abs(x-y)>0.0001){y=x;x=(x+n/x)/2;}r ...
- python牛顿迭代公式_python计算牛顿迭代多项式实例分析
本文实例讲述了python计算牛顿迭代多项式的方法.分享给大家供大家参考.具体实现方法如下: ''' p = evalPoly(a,xData,x). Evaluates Newton's polyn ...
最新文章
- js数组fill()方法
- VC,Windbg,gdb执行到指定代码行方法
- Python:如何仅用递归函数和栈操作逆序一个栈
- 百度推出新技术 MIP,网页加载更快,广告呢?
- 能使用html/css解决的问题就不要使用JS
- [转]sudoers设置
- 日常问题——pdsh localhost Connection refused
- SpringBoot集成Redis缓存
- 1223. Chernobyl’ Eagle on a Roof(dp)poj3783
- 连接主机Java网络编程(一)- 一个简单的服务端/客户端应用程序
- STL 关联容器的lower_bound()和upper_bound()
- 球面坐标系与三角函数 Spherical Coordinates and Trigonometric Functions
- 源码分析学习记录(9)——PBR材质
- 临时手机短信云接收(防骚扰)
- ReactNative出现诸如以上的错误; ** is not defined.都是没有导入相应的库.
- php excel扩展名,excel后缀名是什么
- 【工程理论】引线键合机介绍
- Cutting Sticks
- Java 生成支付二维码返回给前端和自定义二维码背景色
- Z-Blog模板安装和使用教程