Javaでの微分計算

Javaでの微分計算

このページでは、Javaを用いて微分計算を実装する方法について解説します。数値微分や自動微分など、実践的な方法について詳しく説明し、サンプルコードを用いて具体例を示します。

数値微分

数値微分は、関数の微分を数値的に近似する方法です。以下に一般的な方法を示します。

前進差分法

前進差分法では、次のようにして微分を近似します:

$$ f'(x) \approx \frac{f(x+h) – f(x)}{h} $$

ここで、hは非常に小さな値です。


public class NumericalDifferentiation {
    public static double forwardDifference(Function func, double x, double h) {
        return (func.apply(x + h) - func.apply(x)) / h;
    }

    public static void main(String[] args) {
        Function func = Math::sin;
        double x = Math.PI / 4;
        double h = 1e-5;
        System.out.println("sin'(π/4) ≈ " + forwardDifference(func, x, h));
    }
}

中央差分法

中央差分法は次の式を使用し、精度が高いことが特徴です:

$$ f'(x) \approx \frac{f(x+h) – f(x-h)}{2h} $$


public class NumericalDifferentiation {
    public static double centralDifference(Function func, double x, double h) {
        return (func.apply(x + h) - func.apply(x - h)) / (2 * h);
    }

    public static void main(String[] args) {
        Function func = Math::exp;
        double x = 1.0;
        double h = 1e-5;
        System.out.println("exp'(1) ≈ " + centralDifference(func, x, h));
    }
}

シンボリック微分

シンボリック微分では、関数の数式を直接解析し、微分を計算します。Javaでこれを実現するには、SymJavaのようなライブラリを使用することが便利です。

SymJavaを用いた例


import symjava.symbolic.*;

public class SymbolicDifferentiation {
    public static void main(String[] args) {
        Symbol x = new Symbol("x");
        Expr f = x.pow(2).add(x.mul(3)).add(5);
        Expr df = f.diff(x);
        System.out.println("f(x) = " + f);
        System.out.println("f'(x) = " + df);
    }
}

このコードでは、f(x) = x² + 3x + 5の微分を計算しています。結果はf'(x) = 2x + 3となります。

自動微分

自動微分は、プログラム中で数値計算と同時に微分を計算する方法です。この手法では、微分の連鎖律を利用して正確な結果を得られます。

自動微分の実装例

Javaでは、自動微分を実現するライブラリとしてGraphStreamや独自の実装が利用できます。


public class AutomaticDifferentiation {
    public static double[] autodiff(double x) {
        double value = Math.sin(x);  // 関数値
        double derivative = Math.cos(x);  // 微分値
        return new double[]{value, derivative};
    }

    public static void main(String[] args) {
        double x = Math.PI / 4;
        double[] result = autodiff(x);
        System.out.println("sin(π/4) = " + result[0]);
        System.out.println("sin'(π/4) = " + result[1]);
    }
}

微分計算の応用例

微分計算は、多くの応用例があります。以下にいくつかの例を示します。

機械学習における勾配計算

微分計算は、機械学習の勾配降下法で使用されます。損失関数の勾配を計算して、モデルパラメータを更新します。

数値最適化

数値最適化では、目標関数の最適解を求めるために微分計算を利用します。

物理シミュレーション

運動方程式の計算やフィードバック制御の設計など、微分は物理学や工学で広く使用されています。

このページで紹介した方法を参考に、Javaで微分計算を試してみてください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です