例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 ...