【C++】関数の微分・偏微分の計算方法

【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;
}

コメントを残す

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