我要在 Delphi 中实现以下公式:
理解公式:
Y_k 是一个浮点数,我们将其称为 Y。
w[i][j] 也是一个包含浮点数的数组(1<=i<=43 和 1<=j<=30)。
根据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)
也就是说,ℝk 中的一个向量场(在 ℝ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
在你的情况下可能不是一个很大的值(value)。
关于arrays - Delphi中向量/数组的梯度(nabla),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5070796/