【问题标题】:Finding the gradient vector of 3D function求 3D 函数的梯度向量
【发布时间】:2019-12-10 13:11:47
【问题描述】:

我有以下功能

def f(x,y):
    return -(x**2+y**2-2)

函数是hemishpere,在这个函数的表面有一个点(x0,y0,z0),我需要找到显示最大方向的梯度向量。

我有这个代码

Ex,Ey= np.gradient(f(X,Y))
EX, EY = np.meshgrid(Ex,Ey)
Ex_2=max(list(map(max, Ex)))
Ey_2=max(list(map(max, Ey)))

我想知道是否有另一种方法可以找到初始点在 (x0,y0) 的函数(梯度向量)的最大值的向量?

*函数 f(x,y) 由用户给出,这意味着我无法定义 df,因为我不知道将给出的函数

【问题讨论】:

  • 我可能遗漏了一些东西,但你是什么意思? 'f 微不足道的区分吗?你可以定义一个函数 df(x,y) 返回 -2*x-2*y 并将它传递给 numpy 数组。
  • 函数 f(x,y) 由用户给出,这意味着我无法定义 df,因为我不知道将给出的函数

标签: python 3d gradient point contour


【解决方案1】:

在您提出的情况下,我只能看到两个理由寻找np.gradient 的替代品:

  1. 由于精度问题,您不想使用数值微分(np.gradient 所做的)。

  2. 你不能使用 numpy(这似乎不太可能,但也许你有一个非常受限的嵌入式平台?)。

在第一种情况下,我认为您可以研究符号微分或自动微分。前者通常要慢得多,而且使用起来也不太直接。自动微分通常比数值微分更精确,并且在许多库中很容易获得,您可以根据要对用户提供的代码施加多少约束来选择它们,例如

#Autograd (pseudocode)
import autograd.numpy as np
from autograd import grad

def f(x,y):
    #do something with x,y
    #...
    return some_value

df=grad(f)
u=df(1,1) #gradient of f at point (1,1)

#pytorch, might be overkill in your case
import torch
def f(x,y):
    """
    x,y should be torch.Tensor
    """ 
    #do stuff
u=f(x,y)
u.backward()
x.grad #this is the gradient w.r.t x

如果主要关注的是第二种情况并且您不想使用额外的库,则一种可能性是您自己计算具有有限差异的导数,这不会对您的用户增加任何限制,但可能会损害精度,具体取决于它们的功能是什么。另一种选择是对用户提供的函数强制执行约束:要么强制它返回它自己的雅可比行列式,以便你可以在你这边的链式规则中使用它,或者定义你自己的类型,例如@987654321 @ 这将让您计算导数,但会在定义函数/变量时强制用户从该类型派生。

【讨论】:

    猜你喜欢
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多