So-net無料ブログ作成
検索選択

なんちゃってMathematicaを作る - その4 [なんちゃってMathematica]

前置きばかりが続いて全然中身が進んでいないけど、これまでやってきてちゃんと最後まで完成したアプリだけでなく途中でくじけたアプリも含めても一番大きな作業になる。前もってちゃんと計画を立てておくというのは重要である。

ただし、仕事でやるようなぽわぽんで線を引いていついつまでになになにを、なんていうことはもちろんやらない。

僕は仕事でもぱわぽんは使わないけど。

5  さて、これから

これは個人が進めるには大きなプロジェクトになるので、どういう方針で進めるか先に考えておいた方がいい。

ざっくりなにを考えるべきか、を列挙してみると
  • シンタクスの構想
    • Mathematicaのシンタクスのレビュー
    • lex、yaccのおさらい
    • lex、yacc用実装コードの方針決定、問題点抽出、構想修正
  • 評価エンジンの構想
    • LISPの評価エンジンのレビュー
    • 固有の問題点整理
    • 実装方針決定
  • プロットライブラリ
    • 以前やってたことを思い出す
    • 2次元プロットの実装レベルへの分解(できれば実装までやってしまう)
    • 3次元プロットの問題点抽出
  • 入出力フォーマッタ
    • ユーザインターフェイス設計
    • App kit前提の実装の問題点抽出
    • 実装方針決定
  • 具体的なそれぞれの実装
ま、こんなもんだろ。
結構な分量で、途中で飽きたりくじけたりしなければこのネタで少なくとも1年は遊べそうな気配である。ただし、これだけ大きいとどうしても問題が解決できなかったり、面倒になって飽きてしまったりする可能性も高い。でもまあ、そのときはそのときで、別に誰の迷惑にもならないのでいいでしょう。

これができると、やっぱり途中までやってほったらかしてある薄膜設計アプリもこの上に実装する、という手も考えられる。

5.1  薄膜設計アプリ反省会

結構進めておきながらとちゅうでほったらかしになった薄膜設計アプリが、なぜくじけたのかを思い出してみる。

あれは、
  • やるべき計算は決まっていて複雑だが決めうちでいい
  • 最適化ルーチンはgslを流用するつもりだった
  • グラフ表示は同時に進めていたプロットライブラリを使うつもりだった
ということで、すいすい進めることができるはずだった。ところが
  1. 計算内容が決まっているので十分こなれる前に実装を始めた
  2. 一通りの実装ができて答え合わせをすると、ある条件で計算結果が正しくなかった
  3. 実装がすっきりしていないのでデバグが進まない
というふうな経緯をたどって、身動きが取れなくなると同時にいやになってしまった。

どこが一番問題だったかというと、光学薄膜計算のクラス群と最適化のために変数の値を制御するクラス群との整合性があまり良くなかった点。計算用のクラスは何段かの入れ子構造にしたが、最適化変数のアクセスのためのクラスは入れ子のいろいろなレベルから参照されるようになってしまった。計算のクラスは計算の手順に素直に書いたし、最適化のためのクラスも効率のいい設計ができたけど、その二つの関係を整理できなかった。

素人仕事がうまくいかなくなる典型なので、今回はそんなことがないようにしたい。このときの反省をふまえて
  • 設計段階で十分もんでおく
  • クラスを不用意に複雑にしない
  • モチベーションを維持できるようなネタをいつも持っておく
としよう。どうせ納期があるわけではないので、じっくりやろう。

5.2.1  面白そうなところ

lexとyaccはちょっと知っている、という程度でそれを使ってちゃんとしたものを作ったことはない。勉強しながらやりたいことを盛り込んでいくところは面白そうである。

LISPの評価エンジンは、ずっと昔簡単なものを実装したことがある。もうそのときのコードは全く残ってないしもちろん覚えてないけど、小さなコードでちゃんと動くのが面白かったことは覚えている。もういちどその感覚を楽しみたい。

入出力フォーマッタはCocoaのApp Kitを使い倒すことになるはず。NSTableViewをカスタマイズすることになりそうな雰囲気。このへんあまりちゃんといじったことはないので突っ込みがいがありそう。

5.2.2  面白くなさそうなところ

Mathematicaの糖衣構文の要素はすごく多くて、lexとyaccを使うにしても実装は大変。もちろん全部実装しなくてもいいけど、どれを実装するか選んだり、それがlexとyaccでできるか、など調べたりするのも結構大変。

評価エンジンはその評価機構の設計実装はそれほど難しくないけど、動作させるためにはたくさんの関数を定義しないといけない。これは単調な作業でいやになりやすい。

プロットライブラリは途中でくじけているので、もう一度掘り出して設計し直す必要がある。くじけたやつは、途中までやったことをすでに忘れてるけど、所詮同一人物なのでまた同じ過ちを繰り返す可能性もある。2回同じことをしてくじけるとうんざりしてしまう。

gslのそれぞれの機能に対応する関数を定義するのもかなりな手間だけどそこに新しい発見があるわけではなくて単純作業になる気配が濃厚。

5.2.3  ということで

面白くないところに突入すると、一気にやる気が失せて進まなくなって、そのうち何をやっていたか忘れてしまう、ということが起こりやすい。

そうならないためには、やっぱり一つのことに集中してしまうのではなく、いろいろあちこちやるのが良さそうな気がする。

あちこちやると混乱したり、前のを忘れたり、ということになる。しかしまあ、作業効率の低下は仕方ないとしよう。時間がかかるだけで、途中で嫌になるよりはましだろう。

そういう方針でいこうと思う。
nice!(0)  コメント(8)  トラックバック(1) 

nice! 0

コメント 8

NO NAME

此処に お邪魔します
(mathematica 絡みに 関心が ∃ math)

http://userdisk.webry.biglobe.ne.jp/020/691/47/N000/000/001/132016134632613228663_index_gr_1.gif
>「『腑に落ちる』は誤りだ、『腑に落ちない』としか言わない」という声をしばしば聞くようになった。
>夏目漱石が使っています。「彼岸過迄」(1912年発表)にはこうあります。
>何しろこういう問題に就て、出来るだけ本人の自由を許さないのは親の義務に背くのも同然だという意味を
>昔風の彼女の腑{ふ}に落るように砕いて説明した。(新潮文庫 1952年発行 1990年67刷改版 2005年88刷 p.280)

◆ R^3 に 与えられた  任意の 曲線 の 各点と P0=(X0,Y0,Z0)とを結ぶ直線の和集合を 錐面 ◆
    定点 を その 頂点,錐面をつくっている直線 を 母線(父線は皆無)と云う。
 なる 定義 は【 腑に落ちすぎの 定義  故
men and women of all ages 老若男女を問わず  小學生 の 工作 に 倣い (斜)錐面 を 造形 する 】
http://www.google.co.jp/search?hl=ja&rlz=1T4TSJH_jaJP367JP367&q=%E3%83%93%E3%82%A8%E3%83%B3%E3%83%8A%E3%83%BC%E3%83%AC%20%E5%AE%87%E9%83%A8&um=1&ie=UTF-8&tbm=isch&source=og&sa=N&tab=wi&biw=1093&bih=381&sei= 2VWxTsv_JonKmAXG7NSsAg
に 出品 可能.........例えば 次 から ▼ 産出する lemniscate 錐面 ▼  ;
http://userdisk.webry.biglobe.ne.jp/020/691/47/N000/000/000/128680382775216218302.gif
なる ◆レムニスケート(lemniscate)を 平行移動し xy平面に R^3 内の 曲線=青線 として 選び 
       青線 と N=(0,0,1) から 産出された 錐面◆ を 考察します :
http://userdisk.webry.biglobe.ne.jp/020/691/47/N000/000/001/132016134632613228663_index_gr_1.gif ● 先ず(1) 此の錐面の代数曲面 f(x,y,z)=0 (f(X,Y,Z)∈Q[X,Y,Z])を 是非 導出して下さい;
____________________________________=0
(2) 得た  錐面の代数曲面S と 単位球面 との 交線 を 紫で描いた。
其れを x,y平面に正射影した 曲線 prj(S∩単位球面)(に訂正)を 黒で描いた。
 曲線 prj(S∩単位球面)の代数曲線 g(x,y)=0 (g(X,Y)∈Q[X,Y])を 是非 導出して下さい;
____________________________________=0
(3) その後,提示した 双対曲線,双対曲面,双対曲線 達を 是非 求めて下さい。

http://userdisk.webry.biglobe.ne.jp/020/691/47/N000/000/001/132016134632613228663_index_gr_1.gif
の (4) 黒枠の消去を為して下さい。為したなら
左の青、真ん中の紫、右の黒 の 曲線は すべて 有理曲線であることが判明する。
http://math.kyokyo-u.ac.jp/~skiriki/almuni/08shimoharai.pdf
で 丁寧に 論じられている 曲率等 の 概念の 具体例として
(5) 青、紫、黒 の 微分幾何學的 考察 を じっくりと  願います。

   この 有り難い pdf の 一番最後の問題の別解として イデアル で 考察を 為し;
I=<Y^2 + 2*Z*Y - 2*Y + Z^2 - Z, a*X +b*Y +c*Z +d> の  (共通)ZERO点として
その曲線がゲット可能 と a,b,c,d を定め 超平面 に その 曲線が 載っていると 図示願います。
     曲面 Y^2 + 2*Z*Y - 2*Y + Z^2 - Z=0 も 無論 描き。
また この pdf の 理論 から 次の 曲率中心の軌跡等が得られることを証明願います;
http://userdisk.webry.biglobe.ne.jp/020/691/47/N000/000/000/128680382775216218302.gif
また  曲率中心の軌跡 の 双対曲線を 求め 図示 も し、
     微分幾何學的 考察 を も  じっくりと  願います。

    この 有り難い pdf を 無断引用した こと を 詫び,
事後承諾を得たいので pdf を 掲載 されて おられる
      京都教育大学 数学科 
http://math.kyokyo-u.ac.jp/math_kyokyo/English.html
の 方 に 謝辞の メールをも 致します。


by NO NAME (2011-11-03 00:38) 

zyx

こんにちは

Mathematicaのプロット出力は群を抜いて奇麗ですね(2次元プロット)。しかし局所拡大縮小表示したり、拡大表示において上下左右表示移動をinteractiveに行いたい場合に,苦手のようです(マウス動作)。
by zyx (2011-11-03 01:21) 

decafish

NO NAMEさん、コメントありがとうございます。


前にも書いたように、歳のせいで多項式の項が5つを超えると、頭がホワイトアウトするようになっていて、ついていけません。ということで簡単な式の方を見てみました。

gifページの四角内の媒介変数で描かれた平面上の曲線はtの符号によってyのみ反転し、
t -> 1 / u
の変換によってxの符号が反転して同じ式になります。したがってtの[0,1]区間のみ描画してそれをx軸、y軸に対して対称に折り返せば、tが[-∞,∞]の範囲と同じものができます。

ということは、xの分子のt^4の項が無くなるような
t -> (t - 1) / (t + 1)
のような変数変換によって
( t (1 + t^2) / (t^4 + 1), t (1 - t^2) / (t^4 + 1) )・・・(1)
とすることができます。これは楕円積分で有名なlemniscateです。

式(1)からはtを消去するのは簡単で
x^4 + y^4 - x^2 + y^2 + 2x^2 y^2 = 0 ・・・(2)
となります。もちろんgifページの四角内の媒介変数表示の関数もtを消去すればまったく同じになるのは明らか(媒介変数の変数変換のみなので)です。

これが、平行移動でCになるとすれば、
(1, -1/2)
のはずです。それは全部見なくても、いくつかの係数を比較すればわかります(xとyの最高次の係数が16なので、式(2)に代入して、たとえば定数項が13/16、xの2次の係数が11/2になるのはこの組み合わせしかありません)。

これは答えの一部にはなりませんでしょうか?
by decafish (2011-11-03 22:09) 

decafish

zyxさん、コメントありがとうございます。

MathematicaはもともとLISPのインタプリタの構造を持っていたので、入力と出力が1対1に対応するスタティックなものでした。初めてinteractivityを取り込んだときもユーザに対するリアルタイムの反応はFront endの仕事で、途中で式の評価が必要な動作はできませんでした。バージョン6になってManipulateとDynamic関数でひとつの入力に対して複数の評価が発行できるようになってやっと本当の意味でinteractivityが実現できるようになったのですが、やっぱり限界があります。

ちなみに僕は、中途半端なinteractivityが欲しくてMathematicaを使っているのではない、と思ってManipulate関数なんかは使ったことはありません。

とはいいながら、3次元表示をぐりぐり回転させて遊んだりはしていますが。
by decafish (2011-11-03 22:21) 

zyx

こんにちは。

Mathematicaの3次元プロット表示はマウスで楽に拡大縮小回転ができますね。回転表示の中心はプロットの中心に固定されているようなので、たまに不便ですが。
by zyx (2011-11-11 01:34) 

decafish

うわ、初めて知りました。
Cmd+マウスで拡大縮小、Shift+マウスで移動ができました。
回転は知ってて遊んでたのですが、これは知りませんでした。
これ、OpenGLじゃないですよね、拡大しても線の太さは変わらないし。どんな実装でこんな表示効率が出てるんでしょう?
不思議だ....
by decafish (2011-11-12 06:14) 

zyx

こんにちは.

Mathematica級のプロット機能の実現にも期待しています.

私だけかもしれませんが,(シェル)スクリプトなコマンドからも制御可能になって欲しくなりそうです.(現在の Mathematica でもできるのかもしれませんが)

ちなみに,私は,この目的のスクリプタブルなプロットプログラムとして,Abscissa を使っていまして(下記例),制御の自由度や大量データ処理速度に満足しています.ただし,これの出力図の奇麗さについては,論文にそのまま使うレベルには達していないと思っています(Mathematicaの奇麗さに比べると).

#!/bin/bash
# Abscissa (MacOSX用,2次元プロット用,http://rbruehl.macbay.de)
/Applications/Abscissa.app/Contents/Resources/callAbs -x open -f $1 -rY

by zyx (2011-11-26 19:40) 

decafish

コメントありがとうございます。
Abscissa知りませんでした。これは面白いです。3次元は書けないようですが、プロットに特化していてデフォルトのままで見やすい出力を作ってくれるようですね。
よく見ると少なくとも2次元では僕のやりたいことはできてしまってるみたいです。うう....
by decafish (2011-11-26 21:39) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 1

メッセージを送る