C#で数式処理(xFunc.Maths)

xFunc.Maths

グラフ描画を行うソフトxFuncの数式処理部分のライブラリxFunc.Mathsが公開されているので利用する.数式を記号的に扱うことができ,微分もできる.

NuGet経由でインストール可能.ただし,NuGetで公開されているバイナリは.Net Framework 4.5.1向けなので,プロジェクトのプロパティの「対象のフレームワーク」を4.5.1にする.ない場合は,「Microsoft Visual Studio Express 2013 for Windows Desktop」か「Microsoft .NET Framework 4.5.1 Developer Pack」をインストールすれば良い.

http://xfunc.codeplex.com/SourceControl/latestからソースコードもダウンロードできるので,ビルドすれば.Net Framework 4.5.1以外でも使えるはず.

使い方

コードが長くなるので以下のusingをしておく.

using xFunc.Maths;
using xFunc.Maths.Expressions;
式の表現

数式の表現をするには,数式用のクラスを使う方法と,文字列による方法がある.以下のコードはどちらも \begin{eqnarray}x^2\end{eqnarray}を表している.

// 式表現用のクラスによる方法
var siki1 = new Pow(new Variable("x"), new Number(2));
// 文字列による方法
var siki2 = new MathParser().Parse("x^2");
// 数式の表示
Console.WriteLine(siki1);

Variableは変数を表し,Numberは数字を表す.
コンソールへの出力は以下のようになる.

x ^ 2
値を入れて計算

Calculateメソッドによって,変数に値を入れて計算できる.

// 変数格納用クラス
var parameters = new MathParameterCollection();
// 変数名と値を与える
parameters.Add("x", 3);
// 計算
var kekka = siki1.Calculate(parameters);
Console.WriteLine(kekka);

Calculateメソッドの結果はdouble型で返され,以下のように表示される.

9
微分

Differentiateメソッドで微分ができる.

var bibun = siki1.Differentiate();
Console.WriteLine(bibun);

結果は以下のようになる.

1 * (2 * (x ^ (2 - 1)))

これだと見づらいのでSimplifyメソッドで整理することができる.

var simplified = new MathSimplifier().Simplify(bibun);
Console.WriteLine(simplified);

結果は以下のようになる.

2 * x
複数変数の式

複数の変数を持つ式も扱える. \begin{eqnarray}xy^2+\sin(z)\end{eqnarray}の場合,以下のようになる.

var siki3 = new MathParser().Parse("x * y^2 + sin(z)");

偏微分する場合は,Differentiateメソッドの引数として,偏微分したい変数名で作成したVariableを渡す.

// x, y, zに関する偏微分
var dx = siki3.Differentiate(new Variable("x"));
var dy = siki3.Differentiate(new Variable("y"));
var dz = siki3.Differentiate(new Variable("z"));

// Simplify後に表示
var simplifier = new xFunc.Maths.MathSimplifier();
Console.WriteLine(simplifier.Simplify(dx));
Console.WriteLine(simplifier.Simplify(dy));
Console.WriteLine(simplifier.Simplify(dz));

結果は以下のようになる.

y ^ 2
x * (2 * y)
cos(z)

その他

対数とか最小公倍数とか階乗とか色々扱うことができる.細かいところは,ライブラリのソースコードの中にテスト用プログラムも入っているので,それを見ると良いと思う.