python - 非均匀间距,带有 numpy.gradient 的多元导数
问题描述
所以我试图使用 numpy.gradient 得到以下公式的二阶导数,我试图用 S[:,0] 区分它一次,然后用 S[:,1]
S = np.random.multivariate_normal(mean, covariance, N)
formula = (S[:,0]**2) * (S[:,1]**2)
但问题是当我使用间距作为 numpy.gradient 的第二个参数时
dx = np.diff(S[:,0])
dy = np.diff(S[:,1])
dfdx = np.gradient(formula,dx)
我收到错误消息
ValueError: when 1d, distances must match the length of the corresponding dimension
我明白这是因为间距向量长度比公式少一个元素,但我不知道该怎么做才能解决这个问题。我在某处也读到过,您可以将点的坐标而不是间距作为第二个参数,但是当我尝试通过将公式与 S[:,0] 和 S[ 进行微分来检查结果时: ,1],然后尝试通过 S[:,0] 再通过 S[:,1] 来区分它,并比较两个结果,应该是相似的;这两个结果之间存在巨大差异。
谁能向我解释我在这里做错了什么?
解决方案
当使用 Numpy's 引入函数值的坐标向量时gradient
,您必须小心地将其作为具有与函数维度一样多的数组的列表引入,或者指定gradient
您想要的轴(作为 的参数)计算梯度。
当您检查两种微分方式时,我认为问题在于您的公式实际上不是二维的,而是一维的(即使您使用来自两个变量的数据,请注意您的f
数组只有一维)。
看一下这个小脚本,我们在其中验证了微分顺序确实不会改变结果(假设您的函数表现良好)。
import numpy as np
# Dummy arrays and function
x = np.linspace(0,1,50)
y = np.linspace(0,2,50)
f = np.sin(2*np.pi*x[:,None]) * np.cos(2*np.pi*y)
dfdx = np.gradient(f, x, axis = 0)
df2dy = np.gradient(dfdx, y, axis = 1)
dfdy = np.gradient(f, y, axis = 1)
df2dx = np.gradient(dfdy, x, axis = 0)
# Check how many values are essentially different
print(np.sum(~np.isclose(df2dx, df2dy)))
这适用于您的问题吗?
推荐阅读
- mysql - 如何获取mysql中每个用户的最新消息?
- javascript - 在 laravel7 中使用 ajax 和 jquery 导致下拉格式不显示在 html 中
- database - Postgresql 函数有不支持的返回
- reactjs - 'Spring' 不是从'react-spring' 导出的
- javascript - 为什么我必须在表单中的“提交”按钮上按两次才能看到反应中的日志?
- spring - 使用 Java 8 并行流 API 的 SMTP 身份验证异常
- flutter - 来自多个 Firebase 项目的 Flutter FCM 主题消息
- ios - 为什么UIButtons之间要加空格?
- java - 如何正确设置 jaxrs 客户端依赖项?
- sql - SQL根据sum计算延时