簡體   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