旅行好きなソフトエンジニアの備忘録

プログラミングや技術関連のメモを始めました

【C#】 勾配ベクトルを計算するクラス

今回は偏微分を計算するクラス(【C#】 偏微分を計算するクラス - 旅行好きなソフトエンジニアの備忘録)を使って 勾配ベクトルを計算するクラスを実装します。

public class Gradient
{
    private const double _h = 1e-5;

    public static double[] Compute(Func<double[], double> f, double[] x)
    {
        var gradient = new double[x.Length];
        for (int i = 0; i < gradient.Length; ++i)
        {
            gradient[i] = PartialDerivative.Compute(f, x, i);
        }

        return gradient;
    }
}

次はGradientクラスを使ってf(x_0,x_1)=log(x_0^2+x_1^2)(x_0,x_1)=(1,2)における勾配ベクトルを求めます。

double[] gradient = Gradient.Compute((x) => Math.Log(x[0]*x[0] + x[1]*x[1]), new double[] { 1.0, 2.0 });

gradient[0]には2/5に近い値が入っており、gradient[1]には4/5に近い値が入っているため正しく計算できていることを確認できます。

関連記事
【C#】 微分を計算するクラス - 旅行好きなソフトエンジニアの備忘録
【C#】 偏微分を計算するクラス - 旅行好きなソフトエンジニアの備忘録