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;
式の表現
数式の表現をするには,数式用のクラスを使う方法と,文字列による方法がある.以下のコードはどちらもを表している.
// 式表現用のクラスによる方法 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
複数変数の式
複数の変数を持つ式も扱える.の場合,以下のようになる.
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)
その他
対数とか最小公倍数とか階乗とか色々扱うことができる.細かいところは,ライブラリのソースコードの中にテスト用プログラムも入っているので,それを見ると良いと思う.