欢迎访问 生活随笔!

生活随笔

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

编程问答

用numpy autograd 实现牛顿迭代

发布时间:2025/4/16 编程问答 50 豆豆
生活随笔 收集整理的这篇文章主要介绍了 用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)ex=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=xkf(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 实现牛顿迭代的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。