python - 在python中计算点的导数
问题描述
我想计算点的导数,一些互联网帖子建议使用 np.diff 函数。但是,我尝试使用 np.diff 对手动计算的结果(选择一个随机多项式方程并对其进行微分)来查看我是否最终得到相同的结果。我使用了以下 eq : Y = (X^3) + (X^2) + 7 ,我最终得到的结果是不同的。任何想法为什么?有没有其他方法来计算差异。
在我试图解决的问题中,我收到了拟合样条函数的数据点(不是需要通过样条拟合的原始数据,而是已经拟合的样条的点)。x 值的间隔相等。我只有点,没有方程,我需要的是计算一阶,二阶和三阶导数。即 dy/dx、d2y/dx2、d3y/dx3。关于如何做到这一点的任何想法?提前致谢。
xval = [1,2,3,4,5]
yval = []
yval_dashList = []
#selected a polynomial equation
def calc_Y(X):
Y = (X**3) + (X**2) + 7
return(Y)
#calculate y values using equatuion
for i in xval:
yval.append(calc_Y(i))
#output: yval = [9,19,43,87,157]
#manually differentiated the equation or use sympy library (sym.diff(x**3 + x**2 + 7))
def calc_diffY(X):
yval_dash = 3*(X**2) + 2**X
#store differentiated y-values in a list
for i in xval:
yval_dashList.append(yval_dash(i))
#output: yval_dashList = [5,16,35,64,107]
#use numpy diff method on the y values(yval)
numpyDiff = np.diff(yval)
#output: [10,24,44,60]
numpy diff 方法的值[10,24,44,60]
不同于yval_dashList = [5,16,35,64,107]
解决方案
您尝试做的事情背后的想法是正确的,但有几点可以使其按预期工作:
- calc_diffY(X) 有错别字,X**2 的导数是 2*X,不是 2**X:
def calc_diffY(X):
yval_dash = 3*(X**2) + 2*X
通过这样做,您不会获得更好的结果:
yval_dash = [5, 16, 33, 56, 85]
numpyDiff = [10. 24. 44. 70.]
- 要计算数值导数,您应该做一个“差商”,它是导数的近似值
numpyDiff = np.diff(yval)/np.diff(xval)
如果点的值更密集,则近似值会变得越来越好。x 轴上的点之间的差为 1,因此您最终会遇到这种情况(蓝色为解析导数,红色为数值):
如果您将 x 点的差异减小到 0.1,您会得到这个,这要好得多:
只是为了添加一些东西,看看这张图片,它显示了减少数值计算导数的点的距离的效果,取自维基百科:
推荐阅读
- angular - 在 Angular 中从 .subscribe 中获取数据
- reactjs - 如何在倒置的 FlatList 中实现粘性标题?
- angular - 预计间谍 isAuth 已被调用一次。它被调用了0次
- url-routing - 为什么我的 Reitit 路线需要英镑符号?
- google-cloud-platform - 无法使用服务帐号创建 Dataproc 集群
- python-3.x - 是否有 Python 函数可以在 Windows 10 命令行的提示下自动回答“是”?
- r - R中的日期操作
- swift - Swift:不能使用采用 Identifiable 的协议
- scala - 如何在 Spark 中创建有状态的 UDF?
- datatable - 如何显示数据表分页,如 last prev current_page next last?