C#での微分・偏微分の計算
目次
微分とは
微分とは、ある関数の変化率を求める数学的手法です。関数 \( f(x) \) の微分は、以下の極限で定義されます:
\[ f'(x) = \lim_{h \to 0} \frac{f(x+h) – f(x)}{h} \]
例えば、関数 \( f(x) = x^2 \) の微分は \( f'(x) = 2x \) となります。
数値微分の実装
C#では、数値微分を簡単に実装できます。以下は、前進差分法を用いた微分のコードです:
using System;
class Program
{
static double Derivative(Func f, double x, double h = 1e-5)
{
return (f(x + h) - f(x)) / h;
}
static void Main()
{
Func func = x => x * x; // f(x) = x^2
double x = 2.0;
Console.WriteLine($"f'(x) at x = {x}: {Derivative(func, x)}"); // ほぼ 4
}
}
このコードでは、関数の値をわずかにずらして差分を求めることで微分を近似しています。
シンボリック微分の実装
数値微分では誤差が生じるため、シンボリック微分(記号的微分)を行いたい場合があります。C#では、Math.NET Symbolics を使用すると、シンボリック微分が可能です。
using System;
using MathNet.Symbolics;
class Program
{
static void Main()
{
var x = SymbolicExpression.Variable("x");
var func = x * x; // f(x) = x^2
var derivative = func.Differentiate("x");
Console.WriteLine($"f'(x): {derivative}"); // 出力: 2*x
}
}
この方法では、関数をそのまま解析的に微分することができます。
偏微分の計算
偏微分とは、多変数関数の一つの変数についての微分を求めるものです。例えば、関数
\[ f(x, y) = x^2 + y^2 \]
の \( x \) に関する偏微分は \( \frac{\partial f}{\partial x} = 2x \) です。
C#の Math.NET Symbolics を使うと、偏微分も簡単に計算できます:
using System;
using MathNet.Symbolics;
class Program
{
static void Main()
{
var x = SymbolicExpression.Variable("x");
var y = SymbolicExpression.Variable("y");
var func = x * x + y * y;
var dx = func.Differentiate("x");
var dy = func.Differentiate("y");
Console.WriteLine($"∂f/∂x: {dx}"); // 出力: 2*x
Console.WriteLine($"∂f/∂y: {dy}"); // 出力: 2*y
}
}
このようにして、多変数関数の偏微分も簡単に求めることができます。
応用例
微分や偏微分は、様々な分野で活用されています。例えば:
- 最適化: 機械学習や統計解析で、関数の極値を求める際に利用
- 物理学: 速度や加速度の計算
- 経済学: 限界費用や限界収益の計算
例えば、最適化問題で勾配降下法を使用する場合、微分を利用して最適な解を求めます。
using System;
class GradientDescent
{
static double Derivative(Func f, double x, double h = 1e-5)
{
return (f(x + h) - f(x)) / h;
}
static double GradientDescentMethod(Func f, double start, double learningRate = 0.1, int iterations = 100)
{
double x = start;
for (int i = 0; i < iterations; i++)
{
x -= learningRate * Derivative(f, x);
}
return x;
}
static void Main()
{
Func func = x => (x - 3) * (x - 3); // f(x) = (x - 3)^2
double minimum = GradientDescentMethod(func, 0);
Console.WriteLine($"局所最小値の近似値: {minimum}"); // ほぼ3
}
}
このコードでは、勾配降下法を使って関数 \( f(x) = (x – 3)^2 \) の最小値を求めています。
このように、C#を使えば微分・偏微分の計算をプログラムで行うことができます。Math.NETを利用するとさらに便利に解析的な計算が可能です。