【C++】関数の微分・偏微分の計算方法
数値微分の基本
数値微分は、関数の微分を近似的に求める方法です。C++では前進差分・後退差分・中心差分の方法が一般的に使われます。
#include <iostream>
#include <cmath>
// 前進差分法
double forward_difference(double (*f)(double), double x, double h) {
return (f(x + h) - f(x)) / h;
}
// 例: f(x) = sin(x) の微分
int main() {
auto func = [](double x) { return sin(x); };
double x = M_PI / 4;
double h = 1e-5;
std::cout << "f'(" << x << ") ≈ " << forward_difference(func, x, h) << std::endl;
return 0;
}
シンボリック微分
C++ではシンボリック計算を行うために、SymPy (Python) などと連携するか、GiNaCなどのC++ライブラリを利用することができます。
高階微分
高階微分を数値的に求めるには、数値微分を繰り返し適用する方法が使われます。
double second_derivative(double (*f)(double), double x, double h) {
return (f(x + h) - 2 * f(x) + f(x - h)) / (h * h);
}
偏微分の計算
多変数関数の偏微分を数値的に求めるには、1変数を固定して数値微分を適用します。
double partial_derivative_x(double (*f)(double, double), double x, double y, double h) {
return (f(x + h, y) - f(x, y)) / h;
}
自動微分
自動微分 (Automatic Differentiation, AD) は、精度が高く、高階微分にも対応できる方法です。C++ではautodiffライブラリを利用できます。
#include "autodiff/forward/dual.hpp"
using namespace autodiff;
dual func(dual x) {
return sin(x);
}
int main() {
dual x = M_PI / 4;
dual y = func(x);
dual dydx = derivative(func, wrt(x), at(x));
std::cout << "dy/dx at x=pi/4: " << dydx << std::endl;
}