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で微分計算を試してみてください。