arrays - Delphi中向量/数组的梯度(nabla)

标签 arrays delphi vector gradient

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

enter image description here

理解公式:

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/

相关文章:

c++ - 如何使用 boost::interprocess::vector 在共享内存中分配复杂的结构?

php - SELECT * FROM (表名) WHERE (数组值) = '1'

c - 如何在C中动态初始化二维数组?

delphi - 当Delphi检测到可恢复文件时采取的行动?

delphi - 如何在Delphi 7中编译SynEdit?

Delphi 构造函数中的对象引用

c++ - 如何正确删除 vector 中的对象

c - 使用指针和数组时关于不兼容指针类型赋值的警告?

c# - 如何在 C# 中生成具有各种大小的单元格的随机洪水填充

c++ - 从 vector 中删除对象会破坏 C++ 中另一个对象中的对象