用numpy autograd 实现牛顿迭代
生活随笔
收集整理的這篇文章主要介紹了
用numpy autograd 实现牛顿迭代
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1、 導入包庫
- 2、定義函數
- 3、使用`autograd`定義導數
- 4、實現牛頓迭代
- 5、用`scipy`對應方法檢驗結果
- 6、小結
考慮非線性方程:
f(x)=sin?(x)?e?x=0f(x)= \sin(x) - \mathrm{e}^{-x}=0 f(x)=sin(x)?e?x=0
1、 導入包庫
import autograd.numpy as np from autograd import grad import matplotlib.pyplot as plt2、定義函數
def sin_exp(x):return np.sin(x) - np.exp(-x)查看一下函數的圖象:
x_points = np.linspace(-3,3,1000) y_points = sin_exp(x_points)plt.plot(x_points,y_points) plt.show()可見該函數在附近沒有重根。
3、使用autograd定義導數
grad_func = grad(sin_exp)4、實現牛頓迭代
xk+1=xk?f(xk)f′(xk)x^{k+1} = x^{k} - \frac{f(x^{k})}{f'(x^{k})} xk+1=xk?f′(xk)f(xk)?
x = -3. # grad只支持float fun_vals = [sin_exp(x)] # 該變量用于存儲函數值 for i in range(50): x -= sin_exp(x)/grad_func(x)fun_vals.append(sin_exp(x))print('x=',x) print('f(x)=',sin_exp(x)) x= 0.5885327439818611 f(x)= 0.0畫出收斂過程:
plt.plot(fun_vals) plt.show() # 前10個點 plt.plot(fun_vals[:10]) plt.show()5、用scipy對應方法檢驗結果
from scipy.optimize import rootresult = root(sin_exp,-3.)print('x=',result.x) print('f(x)=',result.fun) x= [0.58853274] f(x)= [0.]對比一下差距:
print(x-result.x) [0.]6、小結
(1)用autograd實現簡單非線性方程十分簡單
(2)牛頓迭代收斂速度極快
另外:
(1)函數本身的性質仍然會影響算法的收斂性。本文選取的函數在給定區間內僅有一個根,更復雜的情況未討論。
(2)初始值的選取仍然會影響算法收斂性,本文亦未討論。
總結
以上是生活随笔為你收集整理的用numpy autograd 实现牛顿迭代的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 区间数计算之Python实现
- 下一篇: Python计算本周是第几周