hirax.net::Keywords::「MathLink」のブログ



2009-04-08[n年前へ]

Mathematica Player相手にMathLink 

 Mathematica Playerで計算を行う

MathLinkを使えばWolfram Researchが無料で配布しているMathematica Playerを使って任意の計算を行うことができる。

例えばC#から呼び出すには、.NET/Linkをダウンロードし、NETLink\Examples\Part2\SimpleLinkを参考にすればよい。

ただし、MathKernelAppのほうはリンクに失敗するので、ある程度の制限はあるようだ。

2009-09-28[n年前へ]

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

 .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から自由自在に使うことができる、というのはとても便利に思えます。

2009-09-29[n年前へ]

IronRuby + Mathematica Player で無料数学演習講座 

 昨日に引き続き、IronRuby + Mathematica Player で色んな数式処理をしてみることにします。まずは、昨日のスクリプトのEvaluateToOutputFormの部分を

result=kernelLink.EvaluateToOutputForm(
          "NSolve[x^9+x^4+x+5==0,x]", 0)
と変えてみます。つまり、9次の代数方程式を数値的に解いてみよう、というわけです。すると、答えはこんな風に返ってきます。
{{x -> -1.22021}, {x -> -0.859627 - 0.712543 I}, {x -> -0.859627 + 0.712543 I},{x -> -0.277212 - 1.208 I}, {x -> -0.277212 + 1.208 I}, {x -> 0.607409 - 1.01612 I}, {x -> 0.607409 + 1.01612 I}, {x -> 1.13953 - 0.477782 I}, {x -> 1.13953 + 0.477782 I}}
9次の代数方程式の解が一瞬で(数値的に)求まってしまいます。

 また、

result=kernelLink.EvaluateToOutputForm(
       "Simplify[a x + b x +c x -d]", 0)
といった風にすると、"a x + b x +c x -d"を簡約化した答えを返してくれます。たとえば、こんな風です。
-d + (a + b + c) x
この簡約化する作業は間違えてしまうことが多い割に、結構行うことも多い作業だったりするので、Simplifyが使えるのは、とても便利です。

 もしも、""Solve[a x^4 + b x^3 +c x^2 -d x + e==0,x]"といったコマンドを投げれば、4次代数方程式の解が帰ってくるわけですが、その解を張り付けるにはこのスペースがあまりに狭すぎるので、貼り付けるのはちょっと止めておくことにしましょう。

 あるいは、上の5次方程式で使われている変数に前もって値を代入してやれば、つまり、"a=0;b=0;c=0;d=3;e=1;Solve[a x^4 + b x^3 +c x^2 -d x + e==0,x]"といったコマンドを投げてやれば、

       1
{{x -> -}}
       3
という風にきちんと答えが返ってきます。
result=kernelLink.EvaluateToOutputForm(
    "a=0;b=0;c=0;d=3;e=1;",
    0)
result=kernelLink.EvaluateToOutputForm(
    "Solve[a x^4 + b x^3 +c x^2 -d x + e==0,x]",
    0)
といったように、複数回に分けてコマンドを投げても大丈夫です。自分で苦労して解かなくて済むと、数学の問題も少し楽しく思えます。

 というわけで、Mathematica Playerと.NET/Linkをダウンロードすると、IronRubyなどからMathematicaの機能のかなりの部分を使うことができ、数学の世界を苦労せずに覗いてみることができます。Mathematicaのマニュアルを見ながら、色んな数式処理をさせてみると、きっと面白いと思います。

2009-09-30[n年前へ]

IronRubyから有償版Mathematicaを.NET/Linkで使ってみる 

 今日は、無料で使うことができるMathematica Playerでなく、有償版のMatheticaを.NET/Linkを介してIronRubyから操作してみることにします。具体的には、.NETを使いフォームを表示させ、任意の数式処理を行った結果をグラフィック表示させるプログラムを書いてみます。今回のプログラムは、無料で使うことができるMathematica Playerでは動きません。それは、Mathematica Playerでは下記コード中の"Calculate"メソッドを呼ぶことができないからです。

 今回書いたRuby(IronRuby)コードを下に張り付けてみます。また、実行画面は右上のようになります。処理させたいコマンドをテキスト・エディットに入力し、"Calculate"ボタンを押すと、その下の部分に処理結果がグラフィック表示される、という具合です。

require 'mscorlib'
require 'System.Drawing'
require 'System.Windows.Forms'
require 'Wolfram.NETLink'
include Wolfram::NETLink

class MainForm < System::Windows::Forms::Form
  def initialize
    self.Text="Wolfram::NETLink"
    self.width=500
    self.height=500
    @pictureBox=System::Windows::Forms::PictureBox.new()
    @pictureBox.width=self.width
    @pictureBox.height=self.height
    @pictureBox.Location=System::Drawing::Point.new(0, 30)
    @pictureBox.Image=nil 
    self.controls.add(@pictureBox)
    @inputBox=System::Windows::Forms::TextBox.new()
    @inputBox.Location=System::Drawing::Point.new(100, 0)
    @inputBox.Name="inputBox"
    @inputBox.Size=System::Drawing::Size.new(300, 00)
    @inputBox.TabIndex=2
    @inputBox.Text="Plot3D[Sin[x*y],{x,0,10},{y,0,10}]"
    self.controls.add(@inputBox)
    @kernel=MathKernel.new()
    @kernel.AutoCloseLink=true
    @kernel.CaptureGraphics=true
    @kernel.CaptureMessages=true
    @kernel.CapturePrint=true
    @kernel.GraphicsFormat="Automatic"
    @kernel.GraphicsWidth=@pictureBox.Width
    @kernel.GraphicsHeight=@pictureBox.Height
    @kernel.HandleEvents=true
    @kernel.PageWidth=60
    @kernel.GraphicsResolution=74
    @kernel.Input=nil
    @kernel.Link=nil
    @kernel.LinkArguments=nil            
    @kernel.UseFrontEnd=true
    #@kernel.ResultFormat=ResultFormatType.OutputForm;
    btn=System::Windows::Forms::Button.new
    btn.Location=System::Drawing::Point.new(0, 0)
    btn.Text="Calculate"
    btn_Click=Proc.new() { |sender, e|
    @kernel.Compute(@inputBox.Text)
      @pictureBox.image=@kernel.Graphics.first if @kernel.Graphics.Length>0
    }
    btn.Click(&btn_Click)
    self.Controls.Add(btn)
  end

end

System::Windows::Forms::Application.Run( MainForm.new ) 
 大まかな流れは、MathKernel.new()でMathematicaカーネルと通信準備を行い(Mathematica Playerと通信する場合と異なり、有償版Mathematicaとやりとりする際にはカーネルをダイアログボックスで選ぶ必要はありません)、Computeメソッドをカーネルに対して投げることで計算処理を行い・処理された結果(グラフィック)を
@pictureBox.image=@kernel.Graphics.first
で、ピクチャー・ボックスに貼り付けています。ちなみに、上のコード中にある@kernel.Graphics.firstを@kernel.Graphics[0]としてしまうと、エラーが出て動かなくなってしまうので注意が必要です。

 今日はIronRubyで有償版Mathematicaの機能を使うGUIアプリケーションを書いてみました。…とはいえ、有償版のMatheticaを使うのであれば、高機能なMathematicaノートブックというフロントエンドを使った方が良いような気がします。というわけで、明日からはまた無料Mathematica PlayerとIronRubyで何ができるかを調べてみることにします。

IronRubyからMathematicaを.NET/Linkでもっと使ってみる






2009-10-01[n年前へ]

IronRuby+Mathematica Playerでグラフィック表示(試行錯誤中) 

 IronRuby+Mathematica Playerの組み合わせで、数式処理を行い・さらにその結果をグラフィック表示することに挑戦してみた。まずは、

@kernel.Compute(@inputBox.Text) 
if @kernel.Graphics.Length>0
  @pictureBox.image=@kernel.Graphics.first 
end
の部分をそのままにして、コマンドとしてグラフ描画のコマンドを入力し、Mathematica Player相手に実行してみた。すると、エラーダイアログが出て落ちてしまう。どうやら、Mathematica Playerでは"Compute"させることができないようだ。

 そこで、今度は該当部分を次のように変えて動かしてみる。

@pictureBox.image=
  kernelLink.EvaluateToImage(
    @inputBox.text,500,500)
すると、今度は落ちはしないが「入力文字列の形式が正しくありません」というエラーが出る。有償版Mathematica相手なら、このコードでも正常に動作し、グラフ表示がなされている。どうやら、ここでも有償版MathematicaとMathematica Playerでは動作が異なるようだ。

 念のため、

loop=
  MathLinkFactory.CreateLoopbackLink()
loop.PutFunction("ListPlot", 1)
loop.PutFunction("List", 2)
loop.Put(4)
loop.Put(0)
loop.EndPacket()
e=loop.GetExpr()
loop.Close()
@pictureBox.image=
  kernelLink.EvaluateToImage(e,500,500)
 といったように、Exprクラスでコマンドを渡してやってみても、やはり同じように「入力文字列の形式が正しくありません」というエラーが出てしまう。(上の記述がわかりにくい方は右の書籍「Mathematicaプログラミング 」がお勧めです。Mathematicaの「基本」が一番わかりやすい本です)

 それでは、グラフィックのインタラクティブ表示は(とりあえず)あきらめて、まずはグラフィック表示結果をファイル出力させてみる、という方向転換をすることにした。そこで、こんなコードを書いた。

include System
require 'Wolfram.NETLink'
include Wolfram::NETLink
kernelLink=MathLinkFactory.CreateKernelLink()
kernelLink.WaitAndDiscardAnswer()
result=kernelLink.EvaluateToOutputForm(
  "g=Plot[SIn[x],{x,0,5}]", 0)
result=kernelLink.EvaluateToOutputForm(
   'Export["test.gif"g]',0)
puts result
kernelLink.close
 すると、今度は、グラフィック作成まではできているのだが、その後のファイル出力関数=Export関数が未定義であるような動きになった。

 式・数値入力と数式処理ができれば、とりあえずは十分使えるのだが、グラフィック表示までできると・・・と思ってしまう。というわけで、もう少し試行錯誤が続きそうだ。



■Powered by yagm.net