首页 > 解决方案 > 如何使用有限差分计算数组的导数?

问题描述

我使用此代码创建了一个合成数据-

# x variable
x_value = np.linspace(0,2*np.pi,1000)
# y variable
for i in x_value:    
    y_value = np.sin(x_value)
# create a dataframe with the x and y values
data = pd.DataFrame({'x':x_value, 'y':y_value})

我想为使用有限差分法手动计算的 x ( cos(x_value)) 的导数创建第三列-对于第一行的值,我必须使用前向差分法,最后一行-向后差分,其余使用中央区别。我的代码是这样的 -

# differnce for xvalue, delta_x
data['delta_x']= data['x'].diff(1) # resukts in 0.006289 
# create an empty column
data['deriv'] = ''

# function for Central difference for row 2 to 2nd last row
for i in range(1,len(data)-1):
    data['deriv'][i] = (data['y'][i+1]-data['y'][i-1])/(2*0.006289)
# for the 1st row - forward difference
data['deriv'][0] = (data['y'][1]-data['y'][0])/0.006289
# for the last row - backward difference
data['deriv'].iloc[-1] =  (data['y'].iloc[-1]-data['y'].iloc[-2])/0.006289

我得到了所需的输出(真正的导数和计算的导数匹配),但是我收到了差异方法的警告-SettingWithCopyWarning: A value is trying to be set on a slice of a slice from DataFrame 另外,我正在寻找一个编写此代码的有效方法。提前非常感谢。

标签: pythonpandas

解决方案


如果您对为什么会收到错误感到好奇,您可以阅读有关返回视图与 numpy 数组副本的更多信息。

为了从整体上改进您的代码,我建议您尝试使用 numpy 的向量操作而不是使用 for 循环。

一个例子是计算你的 y_value。我想指出您有一个 for 循环,您在其中反复重新分配

y_value = np.sin(x_value)

没有使用变量 i。我会完全删除 for 循环以节省时间并加快工作速度。


推荐阅读