牛顿法
牛顿法使用方程 \(f(x)\) 的泰勒级数的前几项来寻找 \(f(x)=0\) 的解。
首先选择一个接近 \(f(x)\) 零点的横坐标 \(x_0\),计算 \(f(x_0)\) 及其斜率 \(f'(x_0)\),穿过点 \((x_0,f(x_0))\) 以斜率 \(f'(x_0)\) 做一条直线,获得直线与 x 轴交点 \(x_1\),通常 \(x_1\) 会比 \(x_0\) 更接近零点,一次方法不断迭代即可逼近零点的解。
推导公式化简后得到的迭代公式如下:
在开方中的应用
对于 \(g(x)=x^2\),我们给定任意 \(g(x)\),求解 x 的值,相当于求解 \(x^2-g(x)=0\)。
此处为什么写成 \(g(x)-x^2=0\)?其实是一样的,令 \(f(x)=g(x)-x^2\) 和 \(f(x)=x^2-g(x)\),其导数 \(f'(x)\) 只有符号上的差异,导入迭代公示后负负得正,会得到一样的迭代公式。
根据上述迭代公式,我们令 \(f(x)=x^2-g(x)\),此时对于任意给定的 \(g(x)\),或者说 y 值,我们使用牛顿法求其开方只要将其带入上述迭代公式,则有 \(x_{n+1}=x_n - \frac{x^2-g(x)}{2x}\),注意 g(x) 为给定值,是一个常数。
由此我们就可以写出牛顿法的代码,此处给出 Go 的示例:
package main
import (
"fmt"
)
func Sqrt(y float64) float64 {
x := 1.0
for i:= 0; i < 10; i++ {
x -= (x*x - y) / (2*x) // z 就是上述迭代公式中的 x,x 则是 g(x)
fmt.Println(x)
}
return x
}
func main() {
fmt.Println(Sqrt(2))
}
标签:迭代,求解,公式,fmt,牛顿,近似,零点
From: https://www.cnblogs.com/RubySIU/p/18123563