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で何ができるかを調べてみることにします。
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関数が未定義であるような動きになった。
式・数値入力と数式処理ができれば、とりあえずは十分使えるのだが、グラフィック表示までできると・・・と思ってしまう。というわけで、もう少し試行錯誤が続きそうだ。
2009-10-02[n年前へ]
■IronRubyとMathematica Playerの良い組み合わせ方を考える
さて、.NETで動くRubyであるIronRubyと無料で使うことができるMathematica Playerを組み合わせて遊んでいると、とりあえずは、Rubyの中で数式処理結果を使いたければ、EvaluateToInputFormを使って評価を行い、人間が評価結果を眺めたければ、EvaluateToOutputForm を使って評価を行うのが便利だ、という当たり前の事実に突き当たります。
たとえば、こんなコードを書いてみます。4 x+3==0 という1次方程式を解くだけのコードです。
include System require 'Wolfram.NETLink' include Wolfram::NETLink kernelLink=MathLinkFactory.CreateKernelLink() kernelLink.WaitAndDiscardAnswer() result=kernelLink.EvaluateToInputForm( "Solve[4 x+3==0,x]", 0) puts result kernelLink.closeこのスクリプトを走らせると、
{{x -> -3/4}}という風に答えが返ってきます。こういった形式で答えが返ってくれば、このMathematicaによる数式処理結果を用いてRubyの中で(xを-3/4で)置換を行い何か処理を実行させる・・・といった使い方がいくらでも簡単にわかりやすく書けそうです。 これが、もし EvaluateToInputForm をEvaluateToOutputForm に入れ替えれてみたとするならば、
3 {{x -> -(-)}} 4という答えが返ってくることになります。もちろん、こちらの記述の方が人間はわかりやすいですが、Ruby中で数式評価結果を使おうとすると、これでは不便極まりない表記としか言いようがありません。(もちろん、MathematicaですらOutputFormで出力した結果を直接再利用することはできません)
Mathematica と IronRuby を上手く組み合わせると、結構面白いことができそうです。久しぶりにATOKの機能拡張であるAmetMultiでも引っ張り出して使ってみるか、それともATOK for Windows 無償試用版でもダウンロードしてみて面白い使い方ができないかどうか、少し挑戦してみることにしましょうか…。
2009-10-03[n年前へ]
■「IronRuby」+「Mathematica Player」=「∞の可能性」
まだまだ、「(.NETで動くRubyである)IronRubyと(無料配布されている)Mathematica Playerの組み合わせ技」にハマっています。素晴らしく楽しく使うことができる言語環境Mathematicaと、やはり素晴らしく便利なRubyと、そして(多分便利な).NETを一緒に用いることができるというのは、とてもエキサイティングな体験だからです。
今日は、まずは「Mathematicaの使い方」を眺めながら、クラスタ分析をIronRuby+Mathematica Playerでなぞってみました。
include System require 'Wolfram.NETLink' include Wolfram::NETLink kernelLink=MathLinkFactory.CreateKernelLink() kernelLink.WaitAndDiscardAnswer() result=kernelLink.EvaluateToOutputForm( 'datarecords = { {"Joe", "Smith", 158, 64.4}, {"Mary", "Davis", 137, 64.4}, {"Bob", "Lewis", 141, 62.8}, {"John", "Thompson", 235, 71.1}, {"Lewis", "Black", 225, 71.4}, {"Sally", "Jones", 168, 62.}, {"Tom", "Smith", 243, 70.9}, {"Jane", "Doe", 225, 71.4}};', 0) result=kernelLink.EvaluateToOutputForm( 'FindClusters[Drop[datarecords, None, {1, 2}] -> datarecords]', 0) puts result kernelLink.closeこうコードを書くと、各人の身長と体重のデータを用いて、それらの人を何グループかにクラスタリングを行うことが簡単にできます。たとえば、こんな結果が返ってきます。
{{{Joe, Smith, 158, 64.4}, {Mary,Davis, 137, 64.4}, {Bob, Lewis, 141, 62.8},{Sally, Jones, 168, 62.}}, {{John,Thompson, 235, 71.1}, {Lewis, Black, 225, 71.4}, {Tom, Smith, 243,70.9}, {Jane, Doe, 225, 71.4}}}見事にクラスタリングされています。もちろん、これは、Mathematicaのマニュアルそのままのコードです。けれどそんな処理をRubyで行うことができて、その結果をRubyでさらに使うことができるのはとても便利です。
あるいは、
include System require 'Wolfram.NETLink' include Wolfram::NETLink kernelLink=MathLinkFactory.CreateKernelLink() kernelLink.WaitAndDiscardAnswer() result=kernelLink.EvaluateToOutputForm( 'FindShortestTour[ {{4, 3}, {1, 1}, {2, 3}, {3, -5}, {-1, 2}, {3, 4}}]', 0) puts result kernelLink.closeなんていうコードを書けば、二次元座標群を「どうすれば最短時間(距離)で巡ることができるか?」という巡回セールスマン問題を解くことができます。もちろん、答えはすぐ返ってきて、
{11 + Sqrt[2] + Sqrt[5] + 3 Sqrt[10], {1, 3, 5, 2, 4, 6}}というように、「最短距離」と「どのように点(都市)を廻れば良いか」がたちどころにわかります。
クラスタ分析、巡回セールスマン問題・・・ありとあらゆる問題を、IronRubyとMathematica Playerのタッグは解いてくれます。「IronRuby」+「Mathematica Player」を使っていると、「∞の可能性」を実現できるような「錯覚」を覚えます
2009-10-04[n年前へ]
■IronRubyとMathematica Playerで経済データも自由自在
本当に、「(.NETで動くRubyである)IronRubyと(無料配布されている)Mathematica Player」を組み合わせたツールの可能性は無限大だ、と思います。しかも、その組み合わせが無料だというところがまた素晴らしいです。素晴らしすぎて、「そういう実装でウルフラム・リサーチは良いと考えているのだろうか?」と疑問に思ってしまうくらいです。
今日の例題は、MathematicaのCountryData関数を使って、日本の最近40年間くらのGDP(国内総生産)を習得してみることにします。書くコードはこんな感じです。
include System require 'Wolfram.NETLink' include Wolfram::NETLink kernelLink= MathLinkFactory.CreateKernelLink() kernelLink.WaitAndDiscardAnswer() gdp=kernelLink.EvaluateToInputForm( 'CountryData["Japan", {{"GDP"}, {1970, 2008}}]', 0) puts gdp kernelLink.closeこれで、1970年から2008年までの日本の国内総生産(GDPデータ)が時系列的に手に入ります。ちなみに、結果はこういう形式で返ってきます。
{{{1970, 1, 1, 0, 0, 0}, 2.0295777757538376*^11}, {{1971, 1, 1, 0, 0, 0}, 2.2925 011052164844*^11}, {{1972, 1, 1, 0, 0, 0}, 3.0359415844215283*^11}, {{1973, 1, 1 , 0, 0, 0}, 4.124671054658262*^11}, {{1974, 1, 1, 0, 0, 0}, 4.578535174149201*^1 1}, {{1975, 1, 1, 0, 0, 0}, 4.978680032023408*^11}, {{1976, 1, 1, 0, 0, 0}, 5.59 553536053367*^11}, {{1977, 1, 1, 0, 0, 0}, 6.886633644946532*^11}, {{1978, 1, 1, 0, 0, 0}, 9.675983051549285*^11}, {{1979, 1, 1, 0, 0, 0}, 1.0071187368835983*^1 2}, {{1980, 1, 1, 0, 0, 0}, 1.0552047308073224*^12}, {{1981, 1, 1, 0, 0, 0}, 1.1 662277105414326*^12}, {{1982, 1, 1, 0, 0, 0}, 1.0838309489751625*^12}, {{1983, 1 , 1, 0, 0, 0}, 1.182236662061611*^12}, {{1984, 1, 1, 0, 0, 0}, 1.258002926042118 4*^12}, {{1985, 1, 1, 0, 0, 0}, 1.3467326711952527*^12}, {{1986, 1, 1, 0, 0, 0}, 1.9954327828900427*^12}, {{1987, 1, 1, 0, 0, 0}, 2.4200293838043384*^12}, {{198 8, 1, 1, 0, 0, 0}, 2.9383777035023525*^12}, {{1989, 1, 1, 0, 0, 0}, 2.9401349260 95067*^12}, {{1990, 1, 1, 0, 0, 0}, 3.018112125973376*^12}, {{1991, 1, 1, 0, 0, 0}, 3.4512768484608447*^12}, {{1992, 1, 1, 0, 0, 0}, 3.766884938703116*^12}, {{1 993, 1, 1, 0, 0, 0}, 4.3237911294441895*^12}, {{1994, 1, 1, 0, 0, 0}, 4.76016480 3785754*^12}, {{1995, 1, 1, 0, 0, 0}, 5.24425055236488*^12}, {{1996, 1, 1, 0, 0, 0}, 4.620457424448448*^12}, {{1997, 1, 1, 0, 0, 0}, 4.2337825304782827*^12}, {{ 1998, 1, 1, 0, 0, 0}, 3.8422661071666924*^12}, {{1999, 1, 1, 0, 0, 0}, 4.3476506 956717817*^12}, {{2000, 1, 1, 0, 0, 0}, 4.649614280538379*^12}, {{2001, 1, 1, 0, 0, 0}, 4.0877256836277627*^12}, {{2002, 1, 1, 0, 0, 0}, 3.904822831192468*^12}, {{2003, 1, 1, 0, 0, 0}, 4.231254569386364*^12}, {{2004, 1, 1, 0, 0, 0}, 4.58488 9737074735*^12}, {{2005, 1, 1, 0, 0, 0}, 4.559019715540946*^12}, {{2006, 1, 1, 0 , 0, 0}, 4.434993203595208*^12}}つまり、時間と国内総生産を並べたリスト形式で返ってきます。
もちろん、日本のGDPだけでなく、任意の国のGDPでも、どこかの企業の株価でも、それがどこのマーケットでもいつの時代でも、(基本的には)関数一つで手に入るようになります。もちろん、入手したデータの処理をすることだって、至極簡単です。経済問題をコメンテーターのように評論している文章を見ると、「データを自分で扱い、自分で咀嚼・消化してから話して欲しいものだ」と思ったりしますが、そういった作業を簡単に自分の手で行うことができます。競馬や競輪、はたまた、競艇予想のごとく、経済や株価の行方を実証・予想してみるのにも、IronRuby+Mathematica Playerの組み合わせなら簡単至極にデータ九取得・処理を行うことができます。
これが、最近のMathematicaの便利さでもあり、無料のMathematica Playerを使うことでそのMathematicaの機能を自由にシームレスに使うことができる「(.NETで動くRubyである)IronRubyと(無料配布されている)Mathematica Player」の組み合わせの凄さでもあります。
「データの見せ方」「ビジュアライズ」はとても大切です。けれど「データそのものを手に入れること」「データを加工・処理すること」の重要性は、決して「ビジュアライズ」に劣るものではありません。基本的には、それらすべてが優れていることが理想的であり、現実的には、それらの中で一番弱い部分が相和の効果・力を決めると思っています。
無料で使うことができる Mathematica Playerの一番の便利さ・凄さは、「データ取得」「データ処理機能・言語機能」に関して、本家本元のMathematicaに比べて決して劣っているわけでなく。基本的にはほぼそのままの機能を使うことができるようにしている、というところにあるように思えます。
Rubyから透過的に、Mathematicanを使って入手・計算可能なデータをそのまま自由自在に使うことができる、というのは意外なほどに凄まじい機能拡張だとは思いませんか…?