python語言程序設計,python實現牛頓法_牛頓迭代法Python實現

 2023-12-06 阅读 33 评论 0

摘要:例1:給定方程$$f(x) = x^2 + sin x - 1 = 0$$,判別該方程有幾個實根,并用牛頓法求出方程所有實根,精確到$$10^{-4}$$.解:利用畫圖法觀察根的所在區間為(-2,-1)和(0,1),其中藍色為$$y=f(x)$$的曲線,橘黃色的

0bda389f050a236735532c1b80dec993.png

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

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

python語言程序設計?

c24d443ae619310187a5aa132c9d8e30.png

畫圖代碼:import numpy as np

import matplotlib.pyplot as plt

牛頓迭代法python?def fun(x):

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

def plotCurves():

python 生成器和迭代器、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

import matplotlib.pyplot as plt

def plotCurves2():

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

y1 = np.sin(x)

y2 = 1 - x**2

plt.plot(x,y1)

plt.plot(x,y2)

def main():

plotCurves2()

if __name__ == '__main__':

main()

51781a5c0d504faf7a0e98fce46f2cdf.png

下面分別以-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"經過{k:d}次迭代,初值為{x0:f}的根為{x:.6f}, 此時函數值為{fun(x):.6f}")

return (x,k, fun(x))

else:

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

print(f"經過{k:d}次迭代,初值為{x0:f}的根為{x:.6f}, 此時函數值為{fun(x):.6f}")

return (x,k, fun(x))

x0 = x

print(f"迭代超過{N:d}次,迭代失敗")

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}, C>0$$的牛頓迭代公式,并計算$$\sqrt{115}$$的近似值,計算結果精確到$$10^{-5}$$.# -*- coding: utf-8 -*-

"""

構造計算sqrt{C}, C>0的牛頓迭代公式,并計算sqrt{115}的近似值,計算結果精確到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"經過{k+1:d}次迭代,初值為{x0:f}的根為{x:.6f}, 此時函數值為{fun(x):.6f}")

return (x,k, fun(x))

else:

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

print(f"經過{k+1:d}次迭代,初值為{x0:f}的根為{x:.6f}, 此時函數值為{fun(x):.6f}")

return (x,k, fun(x))

x0 = x

print(f"迭代超過{N:d}次,迭代失敗")

def main():

newton(x0, EPS, N)

if __name__ == '__main__':

main()

結果:10.75

10.723837209302326

10.723805294811097

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

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/192508.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息