如何修正Numpy Gradient计算y=x³导数时的振幅偏差问题?
解决数值导数振幅异常的问题
首先,你的代码存在两个明显问题导致导数显示异常:
- 绘图时误用了未定义的变量
y1和y2,应该替换为实际定义的y(原函数)和dy(数值导数); ylim(-2,2)的范围设置过小,导数3x²在x=1时取值为3,已经超出了这个范围,导致曲线被截断,无法看到完整形态。
其次,np.gradient本身的计算逻辑是正确的——它对中间点使用中心差分、端点使用前后差分计算数值梯度,对于$y=x³$这种光滑函数,计算结果和理论导数$3x²$几乎完全重合。
修正后的完整代码如下:
import numpy as np import matplotlib.pyplot as plt x, sp = np.linspace(-3, 3, 100, retstep=True) y = x**3 # 计算数值导数 dy_num = np.gradient(y, sp) # 理论导数用于对比 dy_theory = 3 * x**2 plt.figure(figsize=(8, 5)) plt.plot(x, y, label='原函数 $y=x^3$') plt.plot(x, dy_num, label='数值导数', linestyle='--') plt.plot(x, dy_theory, label='理论导数 $y\'=3x^2$', linestyle=':') plt.xlabel('x') plt.ylabel('y') # 调整y轴范围以显示完整曲线 plt.ylim(-30, 30) plt.legend() plt.grid() plt.show()
另外需要纠正一个认知:原函数$y=x³$和其导数$y'=3x²$的交点并不在(1,1)。解方程$x³=3x²$可得,交点位于x=0(y=0)和x=3(y=27),这一点在修正后的图中可以清晰看到。
内容的提问来源于stack exchange,提问作者Camilo Ruiz
相关产品推荐
相关产品推荐

