hirax.net::Keywords::「数式処理」のブログ



2011-11-05[n年前へ]

「Wolfram CDF PlayerをMathematicaとして使う方法」をRubyでもっと簡単にしてみた 

 「Wolfram CDF PlayerをMathematicaとして使う方法」を、Rubyコードを書くことで「もっと簡単」「わずか3ステップ」にしてみました。


 Wolfram Mathematicaはプログラミング言語であり、優れた開発環境です。数式処理言語としてスタートしたMathematicaですが、今では汎用言語と言っても良いくらいに、さまざまなことができるようになっています。

 しかし、そんなMathematicaの「玉にキズ」な点が「お値段」です。Mathematica を趣味で使う人たちのために295ドルで「Mathematica ホームエディション」が発売されています。今の円相場なら295ドルは2万3千円ほどになりそうなものですが、残念ながら、日本では(消費税を含めて)7万350円とかなりのお値段になってしまいます。

 そこで、出てくるのが「Mathematicaで作られた「処理アプリケーション」を実行させることができるWolfram CDF Player(かつてWolfram Mathematica Player と呼ばれていたもの)で、汎用的な計算をさせよう」という要望です。無料で配布されているWolfram CDF Player はMathematicaで作られたコードを実行することができまずが、ユーザが任意の数式を入力して処理させることはできません。しかし、そんな”再生専用”MathematicaであるWolfram CDF Playerは、基本的にはMathematicaと同じ処理エンジンが組み込まれていますから、このWolfram CDF Playerに任意の処理をさせてしまおうというアイデアです。 (ここでは触れませんが、CDF PlayerはMathematicaで作られたアプリケーションを実行しているに過ぎない、という点もライセンス上実は重要なポイントです)

 「Wolfram CDF PlayerをMathematicaとして使う方法」は「”決まったURL”から数式を読み込み、その数式を処理するプログラムをMathematicaで作り、そのプログラムをWolfram CDF Playerで再生させる」というアイデア・実装です。このアイデアのポイントになるのは、Wolfram CDF Playerは「”決まった一定のURL”から数式を読み込む」という「非任意」の処理をしているように見えて、実は”そのURL”が出力する数式を任意に変化させることで、任意の数式処理をさせてやる、ということです。「入力した数式をサーバに記憶させ、そのサーバからWolfram CDF Playerが数式を読み込み・処理を行う」という手順で、任意のプログラムをWolfram CDF Playerに実行させることができます。

 しかし、「Wolfram CDF PlayerをMathematicaとして使う方法」で書かれている「ローカル・コンピュータに、PHPをインストールして・HTTPサーバを動かす」という手順は少しばかり面倒です。そこで、Rubyで同じことをもっと簡単にさせることができるコードを書いてみました。つまり、与えられた数式を記憶し・返すというWEBアプリをRubyで書いてみたのです。

require 'webrick'
include WEBrick

contents = ''
s=HTTPServer.new(:Port=>80, 
                 :DocumentRoot=>'')
s.mount_proc("/shutdown"){s.shutdown}
s.mount_proc("/"){ |req,res|
  res.body = 'Work!?'
  if req.query['body'] 
    contents = req.query['body']
    res.body = req.query['callback'] + '.()'                    
  else
    res.body = contents if contents != ''
  end
}
trap("INT"){ s.shutdown }
s.start
 このコードをmath.rbとでも名付けてファイルに保存したら、
ruby math.rb
と打ち(あるいはOSX などであれば、ポート80を開くにはルート権限が必要なので、 sudo ruby math.rbとでも打ち)、Universal Mathematica Manipulator 3にアクセスすれば、Mathematicaと同等の機能を使うことができます。 (ちなみに、http://localhost/shutdownにアクセスすれば、このRuby Webサーバは動作終了します)

 Universal Mathematica Manipulator 3の左側の領域で数式を入力し”TAB”キーを押します。すると、(Rubyで書かれたローカルで動く)HTTPサーバがその数式を記憶します。そして、右側の領域で"eval"を押せば、ブラウザに埋め込まれたWolfram CDF PlayerがRuby HTTPサーバへと数式を探しに行き、結果として、任意のMathematicaプログラムを処理した結果が実行される、というわけです。もちろん、前もって、Wolfram CDF Playerをダウンロード&インストールしておくことも必要です。

 下の画像は、Universal Mathematica Manipulator 3とRubyで書いたWEBサーバで下記コードを実行させてみた際の実行結果です。音楽教室の必需品、ルートヴィヒ・ヴァン・ベートーヴェンの姿が浮かび上がります。あなたなら、どんな風に遊んでみたくなりますか?…やることは簡単「Wolfram CDF Playerのインストール・Rubyコードのコピペ保存&実行・そしてUniversal Mathematica Manipulator 3にアクセスする」のわずか3ステップです。

ExampleData[{"Geometry3D","Beethoven"}]

「Wolfram CDF PlayerをMathematicaとして使う方法」をRubyでさらに簡単にしてみた






2011-11-06[n年前へ]

Mathematica版「おっぱい(曲面)方程式」で「あなた好みのおっぱい」を作る!? 

 「Wolfram CDF PlayerをMathematicaとして使う方法」をRubyでもっと簡単にしてみたので、次は数式処理のみならず汎用処理が可能なプログラム言語であるMathematicaで、何かの処理をさせてみたくなります。まず手始めに、何かをしてみようとなると「オッパイ的なHelloWorld」を作ってみたくなります。

 タイムリーなことに「おっぱい(曲面)方程式を作り出した」という世紀の大発見がありました。そこで、まずはハロー・オッパイということで、Mathematica版「おっぱい(曲面)方程式」を書き、「Wolfram CDF PlayerをMathematicaとして使う方法」をRubyでもっと簡単にしてみたのやり方を使い、Universal Mathematica Manipulator 3でおっぱい(曲面)方程式を描いてみました。描いた結果が右上画像です。

 さて、最初のプログラム(HelloWorld)を書いたなら、次はちょっとカスタマイズして「プログラミングの楽しさを知る」というのが、学びの王道です。そこで、少しだけMathematicaの機能を使ってカスタマイズしてみた結果が下のようすです。「おっぱい肌色方程式」を曲面を塗りつぶす色に対して適用させることで、もっと写実的!?にビジュアリゼーション(可視化)してみました。

 「オレもやりたい」と思ったならば、やることはとても簡単です。「Wolfram CDF PlayerをMathematicaとして使う方法」をRubyでもっと簡単にしてみたのやり方(もしくは「Wolfram CDF PlayerをMathematicaとして使う方法」のやり方)でWolfram CDF PlayerをMathematicaとして使うことができるようにして、後は下記のコードを貼り付け・演算ボタンを押すだけ、です。もちろん、「Mathematicaを持っている」という人であれば「下記のコードをコピペするだけ」で終わりです。それだけの作業で、グリグリとおっぱいを後ろから前から眺めることができます。

Plot3D[
1/8 
  (6 Exp[-((2/3 Abs[x] - 1)^2
    + (2/3 y)^2) - 1/3 (2/3 y + 1/2)^3]
    + 2/3 Exp[-2.818^11 ((Abs[2/3 x] - 1)^2
    + (2/3 y)^2)^2] + 2/3 y - (2/3 x)^4),
 {x, -3, 3}, {y, -3, 3},
 PlotRange -> {-2, 1},
 BoxRatios -> {6, 6, 4},
 PlotPoints -> {100, 100},
ColorFunctionScaling -> False,
 ColorFunction -> Function[{x, y, z},
   If[Sqrt[(Abs[x] - 3/2)^2 + y^2] < 0.45,
    Blend[{Pink,LightPink},0.5],LightPink]],
 Mesh -> None
 ]
 "If[Sqrt[ (Abs[x] - 3/2)^2 + y^2 ] < 0.45, Blend[ {Pink, LightPink}, 0.5], LightPink]],"辺りの記述には、各自それぞれ意見があることでしょう。たとえば"0.45"という部分、あるいはBlend[ {Pink, LightPink}, 0.5]の比率(色)に関する部分…そうしたパラメータ(関数)をほんの少し変えただけで、驚くほど印象が変わるものです。たとえば、"0.45"を"0.35"に、"0.5"を"0.7"に変えてみたのが、右の「おっぱい曲線方程式」です。これだけでも、ずいぶんとニュアンスが変わって見えるものです。0.3でも0.4でもなく、0.45(とか0.35)にするといった小数点以下さらに数桁にこだわるのが「匠(たくみ)のワザ」なのです。…こうしたカスタマイズを繰り返すことで「あなた好みのおっぱい(曲面)方程式」を作り出してみるのも興味深いのではないでしょうか。

 というわけで、ハロー・グッバイならぬ、ハロー・おっぱい…じゃなかった(「Wolfram CDF PlayerをMathematicaとして使う方法」を利用した)Mathematica版ハロー・ワールドを今日は学んでみました。 それにしても、おっぱいの世界は実に奥が深いものですねぇ。


 この続編が、下記の「エクセルで「バスト(曲面)方程式」を描いてみよう!?」です。
 Mathematica(もしくはCDF Player活用)は敷居が高いだろうから、エクセル版も作ってみました。というわけで、エクセルで「バスト(曲面)方程式」を描いてみよう!? (シート付)です。

エクセルで「バスト(曲面)方程式」を描いてみよう!?


*各種環境へのポーティング(移植)例:
  1. Mac OSX Grapher版
  2. Wolfram Mathematica版
  3. Microsoft Excel例
  4. Maxima版
  5. R 版

Mathematica版「おっぱい(曲面)方程式」で「あなた好みのおっぱい」を作る!?Mathematica版「おっぱい(曲面)方程式」で「あなた好みのおっぱい」を作る!?Mathematica版「おっぱい(曲面)方程式」で「あなた好みのおっぱい」を作る!?Mathematica版「おっぱい(曲面)方程式」で「あなた好みのおっぱい」を作る!?Mathematica版「おっぱい(曲面)方程式」で「あなた好みのおっぱい」を作る!?






2012-02-21[n年前へ]

お気楽・超簡単なMathematicaのメモ化(memoization)関数作成テクニック 

 Mathematicaは数式処理を行うためのシステムをLISP風に実装したような「プログラミング言語」です。「Mathematicaにおけるプログラムの高速化手法)」は色々ありますが、今日書くのは「お気楽・超簡単な、Mathematicaのメモ化(memoization)関数作成テクニック」です。

 メモイズ(メモ化=memoization)は、呼び出し時引数と結果をキャッシュし、次回呼び出し時の再計算を不要にする」というテクニックです。膨大な回数の計算を行うように見えて、それらの計算の中で「何回も同じ計算(=引数が同じ関数の呼び出し)」が行われている場合、メモ化を行えば処理時間を大幅に短縮することができます。

 「お気楽・超簡単なMathematicaのメモ化(memoization)関数作成テクニック」は、たったこれだけ(のコード)です。

hoge[x_] := hoge[x] = f(x)
 つまり、(たとえば)xを引数に持つ関数hoge[x]の遅延評価呼び出しで宣言しつつ、「遅延評価が行われた際には、その引数による計算をした上で、その計算結果で(呼び出し引数)に対する関数の”(即時)定義”を行う処理を行うように書く」ことで、「呼び出し時引数と結果をキャッシュする関数」を定義することができる、というわけです。

 たとえば、フィボナッチ数列を計算する関数fib[x]を、こんな風に書くと、

fib[1] = 1;
fib[2] = 1;
fib[n_] := fib[n - 1] + fib[n - 2]
fib[100] を計算するのには、耐えきれないほどの時間が掛かってしまいます。しかし、もしも、こんな風に書いたなら、
fib[1] = 1;
fib[2] = 1;
fib[n_] := fib[n] = fib[n - 1] + fib[n - 2]
fib[100]の計算結果は一瞬で"354224848179261915075"と表示されるはずです。

 Mathematicaは関数(というかシンボル)呼び出し時は、常に引数に「パターンマッチング」を行った上で、「(パターンマッチングの結果に応じて)どのような処理を行うか・どのような値を返すか」を行うかを判断・切り替えます。そのため、上記のようなコードを書くだけで、関数の引数に応じて計算を行ったりキャッシュ値を返したり…という処理を(いともたやすく)実装することができるのです。

 「(膨大な回数の計算を行うように見えて)実は何回も同じ計算をする」という処理をMathematicaで書く場合には、こんな「お気楽・超簡単なMathematicaのメモ化(memoization)関数作成テクニック」を使ってみると、きっと驚くほどの高速化が実現できるはずです。

2012-11-26[n年前へ]

ブラウザ上で動く動的数式オブジェクトソフトで「女の子」周りの視線を眺めてみよう!? 

 数値計算および動的描画ソフトウェアというような具合の(つまりはどのようなソフトウェアであるかを表現しづらい) GeoGebraというソフトがあります。数式を入れると、その数式に対応するオブジェクトが表示され(数式を変更するとそれに応じてオブジェクトも変形し)、オブジェクトを移動、変形させると数式も自動的に変更される…というソフトウェアです。

 このGeoGebraは、iPad やAndroid 版の開発も進められています。そして、それと同時にHTML 5のブラウザ上で動くWEB版も開発されています。このWEB版GeoGebraにアクセスすると、アニメかマンガのヒロインみたいな女の子周りの視線計算をすることができます。

 描き出されること自体はごく当たり前の「幾何学」であったとしても、その幾何学が描くキャラクターが格好いい女の子!となると、意外なほどに目を惹き・面白く感じてしまうものです。

 GeoGebraのようなオブジェクトと数式を動的に連係して動かすことができる(そして、その数式やオブジェクトで示された関係を理解することができる)ソフトの使い道は、ちょうど「ミニスカートの幾何学」カリキュレータ数学ソフトウェア Geo Gebra でハロー・オッパイ!のように、「目や心を惹く何か」を数式で描き出し、それを動的に動かしてみる…という世界が似つかわしいのかもしれません。

 「ミニスカートの幾何学」カリキュレータを作ってみました。どういうものかというと、「ミニスカートの幾何学~32cmの攻防戦~」の計算をユーザがグラフィカル・ユーザーインターフェースを使って自由に行うことができるものです。具体的には、「階段の角度」や「スカートの長さ」を自由に変えて、ミニスカートの幾何学を勉強することができる、というものです。

「ミニスカートの幾何学」カリキュレータ
 この動画は、オッパイの表面(境界)の各部分にかかる力を元に、張力を計算し、張力を曲率に(テキトーに)換算を行った上で、曲率=2階微分値を2階積分した結果をGeo Gebra でインタラクティブに図示した図を(大雑把に言えば)、パラメータを適当に動かすことでアニメーションにする…という具合で作られています。

数学ソフトウェア Geo Gebra でハロー・オッパイ!

ブラウザ上で動く動的数式オブジェクトソフトで「女の子」周りの視線を眺めてみよう!?ブラウザ上で動く動的数式オブジェクトソフトで「女の子」周りの視線を眺めてみよう!?








■Powered by yagm.net