我要在Delphi中实现以下公式:



了解公式:

Y_k是一个浮点数,我们将其简称为Y。

w [i] [j]是一个也包含浮点数的数组(1
根据my source paper(第12页),nabla(w)* Y_k是(列)向量w相对于值Y“的偏导数。这是正确的吗?

Delphi中的编码(实现):

那么如何在Delphi中实现呢?

在此先多谢!

最佳答案

我将假设问题是:“如何在Delphi中计算标量函数的梯度?” [我仍然认为上面给出的符号看起来更像是从微分几何/张量演算得知的连接/协变导数!]

您需要指定获得的输入。最简单的情况是当您获得要计算其梯度的函数f时。根据定义,如果f是k个变量x1,x2,...,xk的函数,也就是说,

f(x1,x2,...,xk)

这是ℝk中的标量场,则梯度为

∇f=(∂f/∂x1,∂f/∂x2,...,∂f/∂xk)

也就是说,以fieldk为单位的矢量场(在ℝk中的每个点上,您都会获得k维矢量)。

这在Delphi中很容易实现。以下是k = 3的情况的示例。

type
  TVector = record
    x, y, z: real;
    constructor Create(ax, ay, az: real);
  end;
  TRealValuedFunction = function(v: TVector): real;

function gradient(f: TRealValuedFunction; v: TVector): TVector;
const
  h = 0.001;
begin
  result.x := (f(TVector.Create(v.x + h, v.y, v.z)) - f(TVector.Create(v.x - h, v.y, v.z))) / (2*h);
  result.y := (f(TVector.Create(v.x, v.y + h, v.z)) - f(TVector.Create(v.x, v.y - h, v.z))) / (2*h);
  result.z := (f(TVector.Create(v.x, v.y, v.z + h)) - f(TVector.Create(v.x, v.y, v.z - h))) / (2*h);
end;


当然在哪里

constructor TVector.Create(ax, ay, az: real);
begin
  x := ax;
  y := ay;
  z := az;
end;


用法示例:

function SampleFunction(v: TVector): real;
begin
  result := 5*v.x + 7*v.y;
end;

procedure TForm4.FormCreate(Sender: TObject);
begin
  with gradient(SampleFunction, TVector.Create(2, 6, 3)) do
    ShowMessage(FloatToStr(x) + ', ' + FloatToStr(y) + ', ' + FloatToStr(z))
end;


结果为5.00000000000256, 7.000000000005, 0,非常接近SampleFunctionv处的梯度(在这种情况下,梯度在空间中是恒定的,也就是说,它不取决于空间中的v点)您选择)。

当然,如果您正在编写任何严肃的文章,则可能会使用自己的向量代数库。

另外,在您的情况下,h = 0.001可能不是一个很大的价值。

关于arrays - 向量/数组在Delphi中的梯度(nabla),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5070796/

10-13 07:52