轻松理解牛顿迭代法且用其求平方根
牛頓迭代法概述
牛頓迭代法(Newton’s method)又稱為牛頓-拉弗森方法(Newton-Raphson method),它是牛頓在17世紀(jì)提出的一種在實(shí)數(shù)域和復(fù)數(shù)域上近似求解方程的方法。
牛頓迭代公式
設(shè)rrr是f(x)=0f(x)=0f(x)=0的根,選取x0x_0x0?作為rrr的初始近似值。
過(guò)點(diǎn)(x0,f(x0))(x_0, f(x_0))(x0?,f(x0?))做曲線y=f(x)y=f(x)y=f(x)的切線L1L_1L1?,L1:y=f(x0)+f′(x0)(x?x0)L_1:y = f(x_0)+f'(x_0)(x-x_0)L1?:y=f(x0?)+f′(x0?)(x?x0?),則L1L_1L1?與xxx軸交點(diǎn)的橫坐標(biāo)x1=x0?f(x0)f′(x0)x_1 = x_0 - \frac{f(x_0)}{f'(x_0)}x1?=x0??f′(x0?)f(x0?)?,稱x1x_1x1?為rrr的一次近似值。
過(guò)點(diǎn)(x1,f(x1))(x_1, f(x_1))(x1?,f(x1?))做曲線y=f(x)y=f(x)y=f(x)的切線L2L_2L2?,L2:y=f(x1)+f′(x1)(x?x1)L_2:y = f(x_1)+f'(x_1)(x-x_1)L2?:y=f(x1?)+f′(x1?)(x?x1?),則L2L_2L2?與xxx軸交點(diǎn)的橫坐標(biāo)x2=x1?f(x1)f′(x1)x_2=x_1-\frac{f(x_1)}{f'(x_1)}x2?=x1??f′(x1?)f(x1?)?,稱x2x_2x2?為rrr的二次近似值。
重復(fù)以上過(guò)程,得rrr的近似值序列,其中,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?)?稱為rrr的n+1n+1n+1次近似值,上式稱為牛頓迭代公式。
舉個(gè)例子
題目
用牛頓迭代法求出2\sqrt{2}2?的二次正近似值(初始近似值x0=2x_0=2x0?=2)。
解答
x=2?x2?2=0x=\sqrt{2}\Rightarrow x^2-2=0x=2??x2?2=0
f(x)=x2?2f(x)=x^2-2f(x)=x2?2
f′(x)=2xf'(x)=2xf′(x)=2x
設(shè)rrr是f(x)=0f(x)=0f(x)=0的正根,x0=2x_0=2x0?=2作為rrr的初始近似值。
f(x)f(x)f(x)過(guò)點(diǎn)A(2,f(2))?A(2,2)A(2,f(2))\Rightarrow A(2,2)A(2,f(2))?A(2,2)。
過(guò)點(diǎn)AAA作曲線y=f(x)y=f(x)y=f(x)的切線L1L_1L1?:
L1:y=f(x0)+f′(x0)(x?x0)L_1:y = f(x_0)+f'(x_0)(x-x_0)L1?:y=f(x0?)+f′(x0?)(x?x0?)
y=2+2?2?(x?2)y=2+2\cdot2\cdot(x-2)y=2+2?2?(x?2)
y=4x?6y=4x-6y=4x?6
則L1L_1L1?與xxx軸交點(diǎn)的橫坐標(biāo)x1x_1x1?:
0=4x1?60=4x_1-60=4x1??6
x1=32x_1=\frac{3}{2}x1?=23?
或者直接用牛頓迭代公式:
x1=x0?f(x0)f′(x0)=2?22?22?2=2?12=32x_1=x_0-\frac{f(x_0)}{f'(x_0)}=2-\frac{2^2-2}{2\cdot2}=2-\frac{1}{2}=\frac{3}{2}x1?=x0??f′(x0?)f(x0?)?=2?2?222?2?=2?21?=23?
x1x_1x1?為rrr的一次近似值。
f(x)f(x)f(x)過(guò)點(diǎn)B(32,f(32))?B(32,14)B(\frac{3}{2}, f(\frac{3}{2}))\Rightarrow B(\frac{3}{2},\frac{1}{4})B(23?,f(23?))?B(23?,41?)。
過(guò)點(diǎn)BBB作曲線y=f(x)y=f(x)y=f(x)的切線L2L_2L2?:
L2:y=f(x1)+f′(x1)(x?x1)L_2:y = f(x_1)+f'(x_1)(x-x_1)L2?:y=f(x1?)+f′(x1?)(x?x1?)
y=14+2?32?(x?32)y=\frac{1}{4}+2\cdot\frac{3}{2}\cdot(x-\frac{3}{2})y=41?+2?23??(x?23?)
y=3x?174y=3x-\frac{17}{4}y=3x?417?
則L2L_2L2?與xxx軸交點(diǎn)的橫坐標(biāo)x2x_2x2?:
0=3x2?1740=3x_2-\frac{17}{4}0=3x2??417?
x2=1712=1.41666666˙x_2=\frac{17}{12}=1.4166666\dot{6}x2?=1217?=1.41666666˙
或者直接用牛頓迭代公式:
x2=x1?f(x1)f′(x1)=32?(32)2?22?32=32?112=1712x_2=x_1-\frac{f(x_1)}{f'(x_1)}=\frac{3}{2}-\frac{(\frac{3}{2})^2-2}{2\cdot \frac{3}{2}}=\frac{3}{2}-\frac{1}{12}=\frac{17}{12}x2?=x1??f′(x1?)f(x1?)?=23??2?23?(23?)2?2?=23??121?=1217?
x2x_2x2?為rrr的二次近似值。
綜上所述,2\sqrt{2}2?的二次正近似值為1712=1.41666666˙\frac{17}{12}=1.4166666\dot{6}1217?=1.41666666˙。
用牛頓迭代法求平方根的Java程序?qū)崿F(xiàn)
假設(shè)你想用程序?qū)崿F(xiàn)求出aaa的正平方根。
已知三個(gè)公式:
由三個(gè)公式可得:
xn+1=xn?xn2?a2xnx_{n+1}=x_n-\frac{x_n^2-a}{2x_n}xn+1?=xn??2xn?xn2??a?
xn+1=xn2+a2xnx_{n+1}=\frac{x_n^2+a}{2x_n}xn+1?=2xn?xn2?+a?
xn+1=xn+axn2x_{n+1}=\frac{x_n+\frac{a}{x_n}}{2}xn+1?=2xn?+xn?a??
因此,容易編寫出以下程序:
public class Sqrt {public static void main(String[] args) {System.out.println(sqrt(2));}private static double sqrt(double a) {if (num < 0)throw new IllegalArgumentException();double err = 1E-15;double cur = a;while (Math.abs(a - cur * cur) > err)//精度越來(lái)越高cur = (cur + a / cur) / 2;return cur;} }參考資料
總結(jié)
以上是生活随笔為你收集整理的轻松理解牛顿迭代法且用其求平方根的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 《基于Java实现的遗传算法》笔记(7
- 下一篇: kaggle(02)-房价预测案例(基础