というわけで、TSGでは今年も占いをやります。今年は、古くは古代中国の五行説に端を発し、中国・明の代に整えられた、「四柱推命学」の占いです。
四柱推命は、生年月日・時刻を元に、人間がうまれつき持っている「運勢」を知る占いです。立春を筆頭とする二十四節(節気)と地球の自転周期を元にして、それぞれ個人の持つ運勢の流れを判定します。いわゆる「辰年生まれ」「卯年生まれ」といった分類を、月日のデータまでつかってより精巧に解析するものと考えれば良いでしょう。
今回のプログラムでは、太陽位置の計算プログラムを中心に、TSGer手製のプログラムで、皆様の基本運勢や相性勢を弾き出します。
ただ、最初にも書いたように、占いで判るのは「運勢」、つまり基本的な運命のめぐり合わせの流れです。実際にどういうめぐり合わせになるか、チャンスを生かすかどうかはあなた自身です。この占いで得られた運勢を、あなたが人生の中でうまく活かしてゆけることを願っています。
<< 1995. 11. 23 Aleph-NULL >>
div(V) = 0 dV/dt + (V・grad)V = -grad(P) + (grad(div(V)) - rot(rot(V)))/Re V:速度ベクトル P:圧力 Re:Reynolds number
何だかわけのわからない方程式ですね。わかる必要はないでしょう。とにかくこのような方程式で流体の運動は計算することができます。
数値計算ならコンピュータが面倒な計算をしてくれるのだから運動方程式ができれば簡単と思われるでしょう。
しかし流体の計算は難しいのです。銀河系のシミュレーションよりも難しいです。流れの場を適切に離散化する格子を生成して偏微分方程式をその格子用に座標変換した差分方程式に書き換えなくてはならないのです。その上で、非線形効果がもたらす「誤差」を可能な限り小さくする工夫を施さなくてはなりません。詳しく書くと長くなるので苦労話はここには書きません。
今日、ここに展示しております「数値流体シミュレータ」は水の流れの中に任意の形の多角柱を入れたときに、水がどう流れるかを数値計算して、その流れの方向、圧力を計算します。いろいろ試して、揚力が大きくなる物体の形を探してみてください。
E = x*x/2.0 + v*v/2.0 ;
となります。またx,vの時間微分の値は運動方程式より
dx/dt = v ; dv/dt = -x ;
なので、オイラー法では数値積分は次のようになります。
x2 = 1 * x1 + dt * v1 ; v2 = -dt * x1 + 1 * v1 ;
(x1,v1),(x2,v2)をベクトルと思えば、これは線形変換です。その変換行列の行列式は(1+dt*dt)ですね。行列式はその変換で任意の平行四辺形の面積の拡大率を表しています。その値が(1+dt*dt)なのですから、オイラー法を進めていくとベクトルの大きさがどんどん大きくなっていってしまうことがわかりますね。
さて、オイラー法をちょっとだけ変えて次の数値積分をしてみましょう。
x2 = 1 * x1 + dt * v1 ; v2 = -dt * x2 + 1 * v1 ;
x1がx2になっただけです。つまり加速度の評価を次の時間ステップでの値を使っているのです。下の式のx2に上の式のx2を代入してみましょう。
x2 = 1 * x1 + dt * v1 ; v2 = -dt * x1 + (1-dt*dt)* v1 ;
この変換行列の行列式は1になってますね。
行列式が1であるということは、変換に対してある保存量が存在するということです。このばあい具体的には次の量が保存されます。
(x*x+v*v)/2.0 +x*v*dt/2.0
エネルギーにおまけの項が付いたもの保存されるのです。このおまけの項はdtが十分小さければ小さな値にしかなりません。つまりエネルギーは数値積分で厳密には保存されないものの真のエネルギー値から上下に微小変動するだけで、大きくずれた値にはならないということです。これがSymplectic法です。その凄さのわりには簡単でしょう。
バネ以外の系の計算も簡単です。加速度が関数a(x,v)でもとまるとしましょう。
x2 = 1 * x1 + dt * v1 ; v2 = dt * a(x2,v1) + 1 * v1 ;
これだけです。C言語でもっと使いやすく書くと
x += dt * v ; v += dt * a(x,v) ;
めちゃ簡単ですね。
さて、これは1次近似のSymplectic法でした。次に2次近似の方法を要点だけ紹介しましょう。
x += dt*0.5 * v ; v += dt * a(x,v) ; x += dt*0.5 * v ;
これだけです。
さらに4次近似を紹介しましょう。
x += dt*c1 * v ; v += dt*d1 * a(x,v) ; x += dt*c2 * v ; v += dt*d2 * a(x,v) ; x += dt*c3 * v ; v += dt*d3 * a(x,v) ; x += dt*c4 * v ;
本当にこれだけです。ただし、係数は以下の通りです。
d1 = d3 = 1.351207192 ( 1.0/(2-2^(1/3)) ) d2 = -1.702414384 ( -2^(1/3)/(2-2^(1/3)) ) d3 = d1 c1 = c4 = d1/2.0 c2 = c3 = (d1+d2)/2.0
最後になんと6次近似も紹介してしまいましょう。
4次近似と方法は同じです。係数のみ紹介します。
d1 = d7 = 0.784513610477560 d2 = d6 = 0.235573213359357 d3 = d5 = -1.177679984178870 d4 = 1.315186320683910 c1 = c8 = d1/2.0 c2 = c7 = (d1+d2)/2.0 c3 = c6 = (d2+d3)/2.0 c4 = c5 = (d3+d4)/2.0
騙されているように感じるかもしれませんが、これで本当にエネルギー保存のシミュレーションができてしまうのです。
今回展示している力学シミュレーションにはこの6次のSymplectic法を使っています。エネルギーが小数点以下12桁までずっと変化しないのが観察できます。
みなさんも是非、このシンプレクティック法を使っていろいろな力学シミュレーションをして遊んでみましょう。
#ニュータイプモードとか、VS モードとか、縦モードとかいうあやしいモードがついているみたいです(^^;
ゲーム自体はとても単純で、落とし穴を掘り、ランダムに歩き回っているエイリアンがそこに落ちたら、すかさず埋めるというものです。たったそれだけなのに、「秋葉堀り」とか「隠居掘り」とか、色々なテクニックが研究されていた模様です。
さて、僕が作ったのは X Window System 用のものです。一応、半年以上前に動くようになっていたのですが、今度はサーバーとクライアントに分離して、色々改良し作り直しました。
#これがちゃんと機能すれば全世界でハイスコア情報の共有も可能かも :-)
「隠居掘り」の一つ ■■■ ○人○ ■■■ |
今は、ターゲットが UNIX 互換 OS + X Window System ですが、Win32 (Windows NT や Windows95 ね) に移植するという話しも ... 僕が作るわけではありませんが (ダレガツクルノカナ ^^;)。
他に、X Window System を使用しないクライアントを作るという (つまりキャラクタ端末でも動くのね) 構想もあったりしますが、実現するかどうかは定かではありません。
この原稿を書いている時点では、まだ完成していません。もし完成しなかったら ... 半年前に作ったやつで、お茶を濁すとしましょう (^^; でわ〜
「シャープ軍のX68000隊も全滅したわ………。
時代遅れのスプライトじゃ何枚表示できたってあいつにダメージを与えられない」
「あのう,いったい何なんですか,あれ?」
「あれはね………”使徒”よ」
「も………もう一匹ふえた?」
「違うわ,シンジ君! これは味方よ」
「ロボット?………なのか」
「一方的にやられてる!」
「(わかってたことだわ………今のTOWNSでは処理が重すぎる)」
「プログラム,動作速度・安定性とも低下! 残りヒープ領域,全メモリの5%!
新規改造コードよりバグ発生! SNK作戦まであと180秒!」
「しかたがない,28800bpsで高速回収しろっ!!」
「まさか………従来ユーザを見捨てる気なの? シンジ君,伏せてっ!!」
(大爆発)
「わはははは。
見たかね!! これが我々のNEOGEO−CDの威力だよ。
これで君の新兵器の出番はもう2度とないというわけだ」
「電波障害のため,目標確認まで今しばらくお待ちください!」
「この大容量だ。ケリはついている!!」
「爆心地にエネルギー反応!!」
「なんだとっ!!」
「映像,回復しました! 目標は依然,健在ですっ!!」
「我々の切り札が………従来のROMユーザを犠牲にしたんだぞ」
「なんてやつだ!」
「化け物めっ!!」
「それで,100メガショックは使徒に効かなかったの?」
「ええ………一瞬売上げにダメージを与えただけ。目標は100万台を突破。依然進行中よ」
「やはり,ポリゴナイザを持ってるみたいね。おまけにジオメトリエンジンもちゃんとあって,CPUパワーに任せた直接処理だけではなく,強力なコプロセッサ群にバックアップされた次世代のゲームマシン,と各種ゲーム誌は分析してるわ」
「着いたわ。ここよ。暗いから気をつけて」
「こ,これは………さっき僕らを助けてくれたロボット!?」
「厳密に言うとロボットじゃないわ。我々が造りだした究極の駒祭用決戦兵器,
「解凍終了。ディレクトリ内のファイルはすべて更新終了。
新作プログラム………ソースディレクトリに入りました!」
「了解! make開始!!」
「プラグマ固定終了。第1次パス開始。マクロ展開!」
「うわっ,なっ,なんなんだ,これ!?」
「心配しないで。プリプロセッサがマクロを取り込めば直接インライン展開してくれるわ」
「うぷっ,気持ち悪いソース………」
「我慢しなさいっ,男の子でしょ!」
「コンパイラ本体起動,全ソースファイルを伝達。コンパイルスタート!」
「字句解析異状なし。構文解析すべて問題なし。オブジェクトファイル生成します!」
「すごいわ………Warningもほとんど出ていない。いけるわ!」
「Marinette初号機,発進準備!!」
「テンポラリファイル削除」
「削除確認。アーカイブ更新」
「第一第二バックアップ生成」
「コンフィグファイル生成完了」
「外部データファイル異状なし」
「Marionette初号機,起動ディレクトリへ!」
「残りメモリ,全てフリー。起動準備完了!」
「了解。碇司令………かまいませんね?」
「もちろんだ。使徒を倒さぬ限りマルチメディアパソコンに未来はない」
「………起動!! いいわね,シンジ君!」
「あ………はいっ」
「最終安全装置,解除!! Marionette初号機,起動!!」
(死なないでね………シンジ君!)
(5分後)
「まさか………」
「………暴走!?」
「たった三日、たった三日でわしにどうしろというのだ。」
急遽、作りはじめたWindows用ゲーム、多くの方に見ていただく物ですから、多人数プレイが出来たらいいな、と思った訳ですが、いいネタが見つからなかったので、多人数プレイを行ったときに、各プレイヤーのインスタンス間での通信量が少なくて済みそう、という理由によって、いわゆる「落ちモノ」になってしまいました。その上、開発環境としてVisualC++2.0を使いたいがためにWin32用にしてしまいました。(ちっ、Windows95の発売に少し遅れたか。(^^;)ただでさえWindows上では苦手なリアルタイムゲーム、マシンパワーとキーボード(!)が許す限りの多人数プレイが可能な物になるはずですが、果たして駒場祭までに完成させることが出来るのか?
発行者 渡辺 尚貴
編集者 安田 知弘
HTML化 木原 英夫
発行所 東京大学理論科学グループ
〒153 東京都目黒区駒場 3-8-1
東京大学教養学部内学生会館 305
TEL 03-5454-4343