python - 如何使用有限差分计算数组的导数?
问题描述
我使用此代码创建了一个合成数据-
# 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 另外,我正在寻找一个编写此代码的有效方法。提前非常感谢。
解决方案
如果您对为什么会收到错误感到好奇,您可以阅读有关返回视图与 numpy 数组副本的更多信息。
为了从整体上改进您的代码,我建议您尝试使用 numpy 的向量操作而不是使用 for 循环。
一个例子是计算你的 y_value。我想指出您有一个 for 循环,您在其中反复重新分配
y_value = np.sin(x_value)
没有使用变量 i。我会完全删除 for 循环以节省时间并加快工作速度。
推荐阅读
- javascript - 为什么我必须单击两次才能触发事件?
- mysql - mysql函数的参数和选择问题
- java - 更改 id 字段的名称
- scala - 为什么 cons 不是 immutable.this.IndexedSeq[List[List[scala.this.Tuple2[scala.this.Char,scala.this.Int]]]] curr :: result 的成员
- jquery - 即使数据变量显示正确的值,jQuery Ajax GET 调用在成功后也不会刷新 html 页面上的数据
- r - 将嵌套矩阵相加的函数
- asp.net-core - AzureAD B2C,返回 URL 登录-oidc ERR_CONNECTION_CLOSED
- python - Robot Framework:获取 url 的特定部分
- javascript - 如何找到函数中声明的参数?
- javascript - 我如何获取输入 onchange 事件以调用 ac# 方法并将值传递给它 asp.net