我具有以下功能
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,因为我不知道将要给出的函数
在您介绍的情况下,我只能看到两个原因来寻找np.gradient
的替代方案:
由于精度问题,您不想使用数值微分(np.gradient
就是这么做的)。
您负担不起使用numpy(这似乎不太可能,但是也许您有一个非常受限制的嵌入式平台?)。]]
在第一种情况下,我认为您可以研究符号或自动区分。前者通常要慢得多,使用起来也不太直接。自动微分通常比数值微分精确得多,并且可以在许多库中轻松获得,您可以根据要对用户提供的代码施加多少约束来进行选择,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 ],这样您就可以计算导数,但是在定义函数/变量时会强制从该类型派生。