牛顿法近似求解

牛顿法

牛顿法使用方程 \(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\) 更接近零点,一次方法不断迭代即可逼近零点的解。
推导公式化简后得到的迭代公式如下:

\[x_{n+1}=x_n-\frac{f(x_n)}{f'(x_n)} \]

在开方中的应用

对于 \(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))
}

posted @ 2024-04-09 12:01  RubySIU  阅读(75)  评论(0编辑  收藏  举报