日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

用numpy autograd 实现牛顿迭代

發布時間:2025/4/16 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用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 plt

2、定義函數

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 实现牛顿迭代的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。