查找3D函数的梯度向量

问题描述 投票:0回答:1

我具有以下功能

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

该函数是半斜边,在此函数的表面有一个点(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,因为我不知道将要给出的函数

python 3d gradient point contour
1个回答
0
投票

在您介绍的情况下,我只能看到两个原因来寻找np.gradient的替代方案:

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

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

  3. 在第一种情况下,我认为您可以研究符号或自动区分。前者通常要慢得多,使用起来也不太直接。自动微分通常比数值微分精确得多,并且可以在许多库中轻松获得,您可以根据要对用户提供的代码施加多少约束来进行选择,e.g。

#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

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

© www.soinside.com 2019 - 2024. All rights reserved.