首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >求三维函数的梯度向量

求三维函数的梯度向量
EN

Stack Overflow用户
提问于 2019-12-10 13:11:47
回答 1查看 359关注 0票数 0

我有以下功能

代码语言:javascript
复制
def f(x,y):
    return -(x**2+y**2-2)

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

我有这个密码

代码语言:javascript
复制
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,因为我不知道将要给出的函数。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-11 16:39:12

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

  1. 由于精度问题,您不想使用数值微分(这就是np.gradient所做的)。
  2. 您负担不起使用numpy (这似乎不太可能,但可能您有一个非常受限的嵌入式平台?)。

在第一种情况下,我认为您可以查看符号或自动区分。前者通常要慢得多,而且也不那么直截了当。自动区分通常比数值微分精确得多,并且在许多库中都是现成的,您可以根据用户提供的代码施加多少约束来选择。

代码语言:javascript
复制
#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)

代码语言:javascript
复制
#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

如果主要关注的是第二种情况,并且您不想使用额外的库,那么一种可能是自己计算带有有限差异的导数,这不会给用户添加任何约束,但可能会影响精度,这取决于它们的功能。另一种选择是对用户提供的函数强制执行约束:或者强制它也返回自己的Jacobian,以便您可以在您的侧链规则中使用它,或者定义您自己的类型,比如对偶数,它允许计算导数,但在定义函数/变量时强制用户从该类型派生。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59268027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档