python實現牛頓法 牛頓迭代法Python實現

2021-10-19 21:21:14 字數 3577 閱讀 2055

例1:給定方程$$f(x) = x^2 + sin x - 1 = 0$$,判別該方程有幾個實根,並用牛頓法求出方程所有實根,精確到$$10^$$.

解:利用畫圖法觀察根的所在區間為(-2,-1)和(0,1),其中藍色為$$y=f(x)$$的曲線,橘黃色的直線是$$y=0$$.

畫圖**:import numpy as np

import matplotlib.pyplot as plt

def fun(x):

return x**2 + np.sin(x) - 1

def plotcurves():

x = np.linspace(-3, 3, 100)

y = fun(x)

y1 = 0.*x

plt.plot(x,y)

plt.plot(x,y1)

def main():

plotcurves()

if __name__ == '__main__':

main()

另外一種觀察方法是,將原來的函式分解為$$y=sin x$$和$$y=1-x^2$$兩個函式,然後觀察它們的交點,如下圖所示:import numpy as np

下面分別以-2和0為初值,用牛頓法求解根。由於$$f(x)=x^2 + sin(x) -1$$,因此$$f'(x) = 2 x + cos(x)$$.# -*- coding: utf-8 -*-

給定方程f(x) = x^2 + sin x - 1 = 0,判別該方程有幾個實根,並用牛頓法求出方程所有實根,精確到1e-4.

@author: morxio

import numpy as np

def fun(x):

'''函式f(x)'''

return x**2 + np.sin(x) - 1

def dfun(x):

"""函式的導函式f'(x)"""

return 2 * x + np.cos(x)

def newton(x0, eps1, eps2, n):

牛頓迭代法x = x - f(x)/f'(x)

x0:初值, n:最大迭代次數

eps1:根誤差限,eps2:函式誤差限

返回方程的根

for k in range(0,n,1):

x = x0 - fun(x0) / dfun(x0)

print(x)

if np.abs(x) < 1:

if np.abs(x-x0) < eps1 or np.abs(fun(x)) < eps2:

print(f"經過次迭代,初值為的根為, 此時函式值為")

return (x,k, fun(x))

else:

if np.abs(x-x0)/np.abs(x) < eps1 or np.abs(fun(x)) < eps2:

print(f"經過次迭代,初值為的根為, 此時函式值為")

return (x,k, fun(x))

x0 = x

print(f"迭代超過次,迭代失敗")

def main():

newton(0.0, 1e-4, 1e-4, 1000)

newton(-2.0, 1e-4, 1e-4, 1000)

if __name__ == '__main__':

main()

結果:第0步: 相鄰迭代步根誤差為: 1.000000

第1步: 相鄰迭代步根誤差為: 0.331248

第2步: 相鄰迭代步根誤差為: 0.031684

第3步: 相鄰迭代步根誤差為: 0.000335

經過3次迭代,初值為0.637068的根為0.636733, 此時函式值為0.000000

第0步: 相鄰迭代步根誤差為: 0.473422

第1步: 相鄰迭代步根誤差為: 0.110144

第2步: 相鄰迭代步根誤差為: 0.006784

第3步: 相鄰迭代步根誤差為: 0.000026

經過3次迭代,初值為-1.409650的根為-1.409624, 此時函式值為0.000000

例2:構造計算$$\sqrt, c>0$$的牛頓迭代公式,並計算$$\sqrt$$的近似值,計算結果精確到$$10^$$.# -*- coding: utf-8 -*-

構造計算sqrt, c>0的牛頓迭代公式,並計算sqrt的近似值,計算結果精確到1e-5.

@author: morxio

import numpy as np

c = 115

x0 = 10

n = 1000

eps = 1e-5

def fun(x):

'''函式f(x)'''

return x**2 - c

def dfun(x):

"""函式的導函式f'(x)"""

return 2 * x

def newton(x0, eps, n):

牛頓迭代法x = x - f(x)/f'(x)

x0:初值, n:最大迭代次數, eps:根誤差限

for k in range(0,n,1):

x = x0 - fun(x0) / dfun(x0)

print(x)

if np.abs(x) < 1:

if np.abs(x-x0) < eps:

print(f"經過次迭代,初值為的根為, 此時函式值為")

return (x,k, fun(x))

else:

if np.abs(x-x0)/np.abs(x) < eps:

print(f"經過次迭代,初值為的根為, 此時函式值為")

return (x,k, fun(x))

x0 = x

print(f"迭代超過次,迭代失敗")

def main():

newton(x0, eps, n)

if __name__ == '__main__':

main()

結果:10.75

10.723837209302326

10.723805294811097

經過3次迭代,初值為10.723837的根為10.723805, 此時函式值為0.000000

牛頓法和牛頓迭代法

牛頓法,大致的思想是用泰勒公式的前幾項來代替原來的函式,然後對函式進行求解和優化。牛頓法和應用於最優化的牛頓法稍微有些差別。牛頓法用來迭代的求解乙個方程的解,原理如下 對於乙個函式f x 它的泰勒級數展開式是這樣的 f x f x 0 f x 0 x x 0 frac f x 0 x x 0 2 f...

牛頓迭代法

創新工廠的筆試題 不用庫函式sqrt 求乙個整型數n的開方,要求精度達到0.001即可。在這裡首先介紹一下牛頓迭代法 假設乙個方程為 f x 0 那麼假設其解為x0,則用泰勒級數展開之後可得 f x f x0 f x0 x x0 0 其中x為其近似解。根據上式推導出 x x0 f x0 f x0 這...

牛頓迭代法

目前接觸到的牛頓迭代法主要應用於兩個方面 1 方程求根問題 2 最優化問題。1 求解方程。並不是所有的方程都有求根公式,或者求根公式很複雜,導致求解困難。利用牛頓法,可以迭代求解。原理是利用泰勒公式,在x0處展開,且展開到一階,即f x f x0 x x0 f x0 求解方程f x 0,即f x0 ...