hirax.net::inside out::2009年09月28日

最新記事(inside out)へ  |   年と月を指定して記事を読む(クリック!)

2009年8月 を読む << 2009年9月 を読む >> 2009年10月 を読む

2009-09-28[n年前へ]

無料配布のMathematicaカーネルをIronRubyから自由自在に使ってみよう  share on Tumblr 

 .NET Framework上で動作するRubyであるIronRubyを使い始めました。使い始めた理由は、(なかなか使う機会がなかった).NETを難しいことを考えずに簡単に使うことができそうだったからです。というわけで、まず一番最初に「無料配布のMathematicaカーネルをIronRubyから自由自在に使う」ということを試してみることにしました。

 ウルフラム・リサーチから無料で配布されているMathematica Playerには、最高に高度な数式処理プログラムである Mathematicaのエンジンが完全に内蔵されています。そこで、そのMathematicaのエンジン部であるMathKernel(Mathematica Playerと一緒に配布されている)を.NETを用いて操作し、IronRubyで自由自在に数式処理をしてみることにします。

 まずは、Mathematica Playerをダウンロード&インストールします、さらに、Mathematicaを.NETインターフェースから使うことができる.NET/Linkもダウンロード&解凍します。そして、もちろんIronRubyも必要なのでダウンロード&解凍しておきます。最後にあともうひとつ、Examples\Part2\SimpleLinkに入っているWolfram.NETLink.dllを取り出して、次に書くRubyコードと同じディレクトリにでも放り込んでおきます。

 あとはRubyのコードを書くだけです。たとえば、こんな具合です。

require 'Wolfram.NETLink'
include Wolfram::NETLink

kernelLink=MathLinkFactory.CreateKernelLink()
kernelLink.WaitAndDiscardAnswer()
result=kernelLink.EvaluateToOutputForm(
        "Solve[a x^2+b x+c==d,x]", 0)
puts result
kernelLink.close
 このコードを、(IronRubyのbinディレクトリ中にある)ir.exeを使い、ir.exe hoge.rbという具合に実行してみます。すると、まず最初の2行で、"Wolfram.NETLink.dll"を読みこんで、.NET/Linkの機能を使えるようになります。そして、MathLinkFactory.CreateKernelLink()でMathematicaカーネルとの通信を開始し(この時、ダイアログが現れるので、たとえばC:\Program Files\Wolfram Research\Mathematica Player\7.0といったパスにあるはずの、MathKernel.exeを選択します)、EvaluateToOutputFormでコマンド文字列をMathematicaカーネルに送り・評価させ、評価結果を(見やすいOutputFormでフォーマットされた)文字列として受け取ります。最終行では、結果を表示しています。

 この例の場合は、

a x^2+b x+c==d
という二次方程式を解くようにMathematicaカーネルにコマンドを送っているので、その解がRubyに渡り、おなじみの二次方程式の解が最後に表示されます。
                  2                                     2
       -b - Sqrt[b  - 4 a c + 4 a d]         -b + Sqrt[b  - 4 a c + 4 a d]
{{x -> -----------------------------}, {x -> -----------------------------}}
                    2 a                                   2 a

 もしも、最小値問題でも解きたければ、

result=kernelLink.EvaluateToOutputForm(
           "Minimize[2x^2-3x+5,x]", 0)
といったコードでも書けば、2x^2-3x+5を最小にするxをMathematicaエンジンが見つけ出し、
 31        3
{--, {x -> -}}
 8         4
という具合に、その結果をIronRubyに渡してくれます。自分で書くと結構大変な数式処理も、世界最高峰のMathematicaエンジンを使うことができると、非常に簡単な作業に変身します。

 無料配布のMathematicaカーネルをIronRubyから自由自在に使うことができる、というのはとても便利に思えます。