繁体   English   中英

寻找 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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM