直觀理解牛頓迭代法


概述

牛頓迭代法是一種數值算法,可以用於求函數的零點。其思想在於把函數抽象為直線,一步步用估計逼近函數的零點。

其逼近速度非常有效,常常在十幾步迭代內就能求得非常精確的結果,十分高效。

引理

考慮在如下坐標系\(xOy\)中的一條直線:

其值在\(x=x_0\)時取值為\(y_0\)。那么這條直線與\(x\)軸的交點的\(x\)坐標\(A\)為多少?

設這條直線的解析式為\(y=kx+b\),則有

\[y_0=kx_0+b \]

\[b=y_0-kx_0 \]

\(y=0\),得方程

\[kx+y_0-kx_0=0 \]

解得

\[x=\frac{kx_0-y_0}{k} \]

\[x=x_0-\frac{y_0}{k} \]

牛頓迭代法

我們正式開始使用牛頓迭代法求函數\(f(x)\)的零點。

問題:試求\(\sqrt{2}\)的近似值。

原命題等價於求函數\(f(x)=x^2-2\)的零點。

第一步:猜測初始值

首先我們隨便猜測一個值。不妨設為\(x=4\)吧。

第二步:迭代

\((x,f(x))\)點作\(f(x)\)的切線,得到:

根據導數的幾何意義,這條直線的斜率為\(f'(x)\),則根據我們前面得到的結論,這個函數與\(x\)軸的交點的\(x\)坐標為

\[x'=x-\frac{f(x)}{f'(x)} \]

根據最理想的估計,如果導數不變的話,零點應該就在那個位置。那么我們令\(x=x'\),這稱為一次迭代。

回到例子。\(f(x)=x^2-2\),則\(f'(x)=2x\),則有:

\[x'=x-\frac{f(x)}{f'(x)}=x-\frac{x^2-2}{2x}=\frac{x}{2}+\frac{1}{x} \]

每次用\(\frac{x}{2}+\frac{1}{x}\)替代\(x\),重復以上過程:

可以看到,僅僅進行了六次迭代,就得到了\(20\)位的精確值。

程序如下:

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const double eps=1e-10;
double a,x;
double f(double x){return x*x-a;}
double df(double x){return 2*x;}
int main(){
	scanf("%lf",&a);
	x=1;
	while(fabs(f(x))>=eps)x-=f(x)/df(x);
	printf("%.10lf\n",x);
} 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM