寻找 3D 函数的梯度向量

Finding the gradient vector of 3D function

我有以下功能

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 因为我不知道将要给出的函数

在您介绍的情况下,我只能看到两个原因来寻找 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

如果主要关注的是第二种情况并且您不想使用额外的库,一种可能是您自己计算具有有限差分的导数,这不会对您的用户增加任何限制但可能会损害精度取决于它们的功能。另一种选择是对用户提供的函数施加约束:要么强制要求它也 return 它自己的雅可比行列式,这样你就可以在你这边的链式法则中使用它,或者定义你自己的类型例如 Dual Numbers 可以让您计算导数,但会强制用户在定义 function/variables 时从该类型派生。