【问题标题】:non uniform spacing, multivariate derivative with numpy.gradient非均匀间距,带有 numpy.gradient 的多元导数
【发布时间】:2020-07-15 19:23:42
【问题描述】:

所以我尝试使用 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] 进行区分,并比较两个结果,应该是相似的;这两个结果之间存在巨大差异。

谁能向我解释我在这里做错了什么?

【问题讨论】:

    标签: python numpy gradient


    【解决方案1】:

    当使用 Numpy 的 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)))
    

    这适用于您的问题吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-03
      • 1970-01-01
      相关资源
      最近更新 更多