Javaで偏微分を計算する方法
このページでは、Javaを使用して偏微分を計算する方法について詳しく解説します。各セクションのリンクを以下に示します。
偏微分の概要
偏微分は多変数関数の一部の変数についてのみ微分を行う操作です。例えば、関数 \( f(x, y) = x^2 + y^2 \) に対して、\( x \) についての偏微分は \( \frac{\partial f}{\partial x} = 2x \) となり、\( y \) についての偏微分は \( \frac{\partial f}{\partial y} = 2y \) となります。
Javaでは偏微分を数式として解析的に求める(シンボリック微分)方法と、値を使って近似的に計算する(数値微分)方法があります。
シンボリック微分の実装
シンボリック微分は関数を文字列として扱い、その文字列を解析して微分を行います。これには正規表現や構文解析ツールを用いることが多いです。
以下は、単純な多項式関数のシンボリック微分を実装する例です。
import java.util.regex.*;
public class SymbolicDifferentiation {
public static String differentiate(String function, String variable) {
// 正規表現を用いた簡単な多項式の微分
Pattern termPattern = Pattern.compile("([+-]?\\d*)\\*?" + variable + "\\^?(\\d*)");
Matcher matcher = termPattern.matcher(function);
StringBuilder result = new StringBuilder();
while (matcher.find()) {
String coeffStr = matcher.group(1);
String powerStr = matcher.group(2);
int coeff = coeffStr.isEmpty() || coeffStr.equals("+") ? 1 : coeffStr.equals("-") ? -1 : Integer.parseInt(coeffStr);
int power = powerStr.isEmpty() ? 1 : Integer.parseInt(powerStr);
if (power > 1) {
int newCoeff = coeff * power;
int newPower = power - 1;
result.append(String.format("%+d*%s^%d", newCoeff, variable, newPower));
} else if (power == 1) {
result.append(String.format("%+d", coeff));
}
}
return result.length() > 0 ? result.toString() : "0";
}
public static void main(String[] args) {
String function = "3*x^2 + 2*x + 5";
String variable = "x";
String derivative = differentiate(function, variable);
System.out.println("関数: " + function);
System.out.println(variable + "についての偏微分: " + derivative);
}
}
このコードは単純な多項式に対して動作します。例えば、\( f(x) = 3x^2 + 2x + 5 \) に対して、\( f'(x) = 6x + 2 \) を計算します。
数値微分の実装
数値微分では、微小な変化量を用いて関数の微分係数を近似します。これは以下の公式に基づきます。
\[ \frac{\partial f}{\partial x} \approx \frac{f(x + h) – f(x)}{h} \]
以下に数値微分を実装する例を示します。
public class NumericalDifferentiation {
public static double differentiate(Function function, double point, double h) {
return (function.apply(point + h) - function.apply(point)) / h;
}
public static void main(String[] args) {
Function function = (x) -> x * x + 3 * x + 5;
double point = 2.0;
double h = 1e-5;
double derivative = differentiate(function, point, h);
System.out.println("点 x = " + point + " における偏微分: " + derivative);
}
}
このプログラムは関数 \( f(x) = x^2 + 3x + 5 \) の点 \( x = 2 \) における数値微分を計算します。