我要在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
,非常接近SampleFunction
在v
处的梯度(在这种情况下,梯度在空间中是恒定的,也就是说,它不取决于空间中的v
点)您选择)。当然,如果您正在编写任何严肃的文章,则可能会使用自己的向量代数库。
另外,在您的情况下,
h = 0.001
可能不是一个很大的价值。关于arrays - 向量/数组在Delphi中的梯度(nabla),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5070796/