Mon, 16 Oct 2006
平面上の凸n角形と言う制限をなくして考えてみる。
つまり、三角形分割したときの面の張り方がメビウスの輪みたいになっていることを許すことにするとどうなるか。
n=5の場合は、平面の場合以外に、
- [0,2,3]
- [1,3,4]
- [2,4,0]
- [3,0,1]
- [4,1,2]
の5つの三角形で分割する方法がある。普通の平面上だと当然自己交差が起こってしまうけれども、ここではそれは考えないことにする。
力技でnが小さいときに数えてみる
| n角形 |
3 |
4 |
5 |
6 |
7 |
8 |
| n-2個の三角形による分割 |
1 |
2 |
5 |
14 |
42 |
132 |
| n個の三角形による分割 |
0 |
0 |
1 |
14 |
141 |
1056 |
| n+2個の三角形による分割 |
0 |
0 |
0 |
2 |
210 |
4968 |
| n+4個の三角形による分割 |
0 |
0 |
0 |
0 |
49 |
10184 |
| n+6個の三角形による分割 |
0 |
0 |
0 |
0 |
0 |
7012 |
| n+8個の三角形による分割 |
0 |
0 |
0 |
0 |
0 |
272 |
| 三角形による分割合計 |
1 |
2 |
6 |
30 |
442 |
23624 |
まだ規則性が見えていません。
posted at 00:59 |
category: /Math/Discrete |
固定リンク(多角形の三角形分割(その2))
Tue, 10 Oct 2006
R はデータ解析処理ソフトだけれども、OpenGL の機能をいくつか使うことができるので、簡易 3D 表示ソフトとしても使えるのです。ポリゴン表示の練習として、三葉結び目のザイフェルト曲面をポリゴンで表示させてみました。位相的にはメビウスの輪と同じなので、表裏がないため片面だけ表示するとおかしくなるから、両面とも赤色にしてあります。
作るのに使った
R のスクリプト。
> install.packages("rgl")
> library(rgl)
してから使おう。
posted at 02:19 |
category: /R |
固定リンク(Rで3D表示)
Sun, 06 Aug 2006
凸n角形を三角形に分割する方法が何通りあるかを考えてみた。
n=4の時は、対角線の引き方だから2通り。
n=5の時は、頂点を順に0,1,2,3,4とすると、
- [0,2][0,3]
- [1,3][1,4]
- [2,4][2,0]
- [3,0][3,1]
- [4,1][4,2]
の辺を追加する5通り。n=6の時は14通りである。
一般にはn角形(n≧3)
の時
Π_{k=2}^{n-1} (4k-6)/k
通りになる。小さいところを計算すると
- n=3のとき1
- n=4のとき1*(6/3)=2
- n=5のとき1*(6/3)*(10/4)=5
- n=6のとき1*(6/3)*(10/4)*(14/5)=14
- n=7のとき1*(6/3)*(10/4)*(14/5)*(18/6)=42
のようになる。
上の式の (4k-6)/k の部分は
- 4k-6 = 2(2k-3) = 2*(k角形の三角形分割が与えられた時の辺と対角線の本数)
- k = k角形の頂点の回転による同一視
をあらわす。すなわち、n角形の三角形分割と、三角形分割を与える頂点の順序つきの組が与えられた時に、(n+1)角形の三角形分割が与えられることをいう。さらにそれが、頂点の番号付けに対して対称であることを言えばよい。
- 頂点の組[p,q]が辺の場合は、1点rを外部に追加して[p,r,q]を新たな三角形として、(n+1)角形の三角形分割を得る。ここで、[p,q]が順方向なら頂点の番号は r = q として、新たな q は r+1 とする。逆方向なら r = q+1 として、新たな p = r+1 とする。
- 頂点の組[p,q]が対角線の場合は、[p,q,r=q+1] を新たな三角形として追加する。p>q
の場合は p もひとつ増やす。
n=4 の時の例として計算してみると、[0,1,2][0,2,3] を4角形の三角形分割として、
- [0,1]を追加した場合[0,1,2][0,2,3][0,3,4]という5角形の三角形分割を得る
- [1,0]を追加した場合[0,1,2][0,2,3][0,3,4]という5角形の三角形分割を得る
- [1,2]を追加した場合[0,1,3][1,2,3][0,3,4]という5角形の三角形分割を得る
- [2,1]を追加した場合[0,1,3][1,2,3][0,3,4]という5角形の三角形分割を得る
- [2,3]を追加した場合[0,1,2][0,2,4][2,3,4]という5角形の三角形分割を得る
- [3,2]を追加した場合[0,1,2][0,2,4][2,3,4]という5角形の三角形分割を得る
- [3,0]を追加した場合[0,1,4][1,2,3][1,3,4]という5角形の三角形分割を得る
- [0,3]を追加した場合[0,1,2][0,2,3][0,3,4]という5角形の三角形分割を得る
- [0,2]を追加した場合[0,1,2][0,2,3][0,3,4]という5角形の三角形分割を得る
- [2,0]を追加した場合[0,1,3][1,2,3][0,3,4]という5角形の三角形分割を得る
が得られ、[0,1,3][1,2,3]からも同様に得られて、頂点の回転対象性から、同じ三角形分割が
4つずつ得られるので、2*10/4=5通りの三角形分割が得られる。
追加情報
The On-Line Encyclopedia of Integer Sequences
によると、この数列は Catalan numbers として知られているみたいです。
posted at 23:37 |
category: /Math/Discrete |
固定リンク(多角形の三角形分割
)
Mon, 03 Jul 2006
Sun, 18 Jun 2006
Wed, 14 Jun 2006
JUNG に PageRank を計算するクラスがついている。それによると、
推移確率行列と定数行列(すべての成分が定数=1/頂点数)を内分した行列
の最大固有値の固有ベクトルを求めているみたい。すべての成分が定数の行列と
いうのは、マルコフ過程の推移確率行列だと思うと、
すべての頂点に同確率で移りうるということだから、
辺をたどらずに別の頂点にジャンプする場合を考慮したものといえる。
(1-alpha)*推移確率行列+alpha*定数行列という形で、
alpha の値は0.1から0.2までぐらいが適当。
こうすると、
- ボナチッチの中心性指標=隣接行列の最大固有値の固有ベクトル
- PageRank=推移確率行列(を少し摂動したもの)の最大固有値の固有ベクトル
となり区別がわかりやすい。
posted at 20:34 |
category: /ComplexNetwork |
固定リンク(PageRank
)
Sun, 11 Jun 2006
Mon, 29 May 2006
JUNGを使ったシミュレータを使って、バラバシ・アルバートの
スケールフリーシミュレータのクラスタ係数と平均頂点間距離を計算してみた。
ワッツ・ストロガッツのスモールワールドネットワークの結果と比較するために
頂点数と辺の数の合計が同じになるようにシミュレーションを行った。



結果がこのグラフで、赤色の点がスモールワールドネットワークのシミュレーションの
ノードを付け替える確率を変えながら行ったもので、黄色の点がバラバシ・アルバートの
シミュレーションの結果得られたネットワークである。
それぞれ頂点数100、辺の数1000の場合、
頂点数500、辺の数5000の場合、
頂点数600、辺の数12000の場合の
グラフである。
これを見ると、バラバシ・アルバートのスケールフリーネットワークは
クラスタ係数がかなり小さいので、スモールワールドネットワークになっているとは
言いがたいかもしれない。しかし、ワッツ・ストロガッツのモデルの系列の上に
ほぼ乗っているのは偶然だろうか?
もちろんグラフの構造の面では両者は大きく異なる。
(例えばラプラシアンの固有値を見ればワッツ・ストロガッツの一連のネットワークから
バラバシ・アルバートのネットワークが離れたところにあることがわかる)
ワッツ・ストロガッツのモデルは規則的なグラフに少しランダムな要因を
与えたもので、バラバシ・アルバートのモデルはランダムに成長する過程の中に
少しだけ規則性を与えたもの、だと考えると、規則性とランダム性の両方を
うまくバランスよく与えることで、性質のよいネットワークモデルが得られるのかも
しれない。
posted at 23:29 |
category: /ComplexNetwork |
固定リンク(バラバシ・アルバートのスケールフリーネットワークのクラスタ係数
)
Sun, 21 May 2006
JUNGを使ったシミュレータを使って、ワッツとストロガッツが行った数値実験を
追試してみた。ここでは、頂点の個数を500とし、各頂点から20本の辺が出ている
ネットワークで行った。

レギュラーネットワークから辺の付け替えをする確率を少しずつ
変えながら、クラスタ係数Cと平均頂点間距離Lを計算して
横軸を確率の対数で相対値をプロットしたグラフ。
ほぼ他の書物で触れられているような形が得られた。
posted at 23:18 |
category: /ComplexNetwork |
固定リンク(ワッツとストロガッツのシミュレーションの結果
)
現実の世界において
頂点の個数に比べて、頂点間の平均距離が近い(スモールワールド現象)
を説明するために考えられたモデル。完全グラフだったり、1つの頂点に
すべての頂点からの辺が集中した星型グラフなら平均距離が近いのは当たり前だが、
これは現実世界をうまく表現していない。
現実世界では辺の数(人間関係の場合友人の数)
はそれほど多くなく、局所的には緊密な関係を多く形成している。
そこで、緊密さを定義するクラスタ係数を用いて、
辺の数が少ない時に、クラスタ係数は高いのにもかかわらず、平均頂点間距離が
小さいネットワークをスモールワールドネットワークと言う。
posted at 23:03 |
category: /ComplexNetwork |
固定リンク(スモールワールドネットワーク
)
Sat, 06 May 2006
Pajek
を試してみました。
グラフをレイアウトするための方法がいろいろ実装されているのはよいです。
日本ではタンパク質のネットワークの研究をされている方や社会ネットワークを
研究されている方が使っているみたいです。
扱っているデータは拡張子が NET の
*Vertices 9
1 "1" 0.3034 0.7561
2 "2" 0.4565 0.6039
3 "3" 0.4887 0.8188
4 "4" 0.5687 0.4184
5 "5" 0.3574 0.4180
6 "6" 0.7347 0.2678
7 "7" 0.9589 0.3105
8 "8" 0.8833 0.1269
9 "9" 0.7034 0.0411
*Arcs
*Edges
1 2 1
1 3 1
2 3 1
2 4 1
2 5 1
4 5 1
4 6 1
6 7 1
6 8 1
6 9 1
7 8 1
8 9 1
と言った形式のファイル。これをpajekに読み込ませて使う。できることは
- 頂点をマウスでドラッグして位置変更
- 頂点、辺の大きさ、色、ラベルなどの表示のカスタマイズ
- Random / Erdos-Renyi / Scale-Free Network などの生成
- Path / Flow の計算
- Komada-Kawai Algorythm でのレイアウト
- Fruchterman Reingold でのレイアウト
- グラフの回転アニメーション
- PS / VRML / SVG / BMP 形式の Export
などなど。他にもたくさん。
扱っているグラフの履歴を残してくれているのはとてもよいです。
3Dレイアウトして回転させると楽しいです。
参考文献
posted at 13:26 |
category: /ComplexNetwork |
固定リンク(Pajek
)
私は
- ライブラリとして提供されている
- 可視化のための機能が豊富
- Java言語で実装されている
という理由で、JUNG を使っています。
自分でシミュレーションのロジック(乱数や簡単な力学系を使って)
を組みたい時は、可視化ツールではなくて、ライブラリの方が都合がいいんです。
もちろん可視化やシミュレータとしてなら、
単体のアプリケーションもいろいろあるみたいです。
時間ができたらそれぞれレビューもして見たいな。
INSNA
(International Network for Social Network Analysis)
という団体があって、そこで
Computer Programs for Social Network Analysis
をまとめています。
posted at 11:33 |
category: /ComplexNetwork |
固定リンク(ネットワークシミュレータいろいろ
)
Thu, 27 Apr 2006
グラフィカルモデリングの可視化ツールを作ってみました。
グラフィカルモデリング計算機(Java Web Start)
テキストエリアにcsvで1行目に項目を、2行目以降にデータをコピー&ペーストで
貼り付けて GraphGenerate ボタンを押してください。JUNG を使って
グラフを生成します。ただし、関連があるかどうかは、偏相関係数の絶対値が
Threshold の値よりも大きいときとします。
初期状態では、2005年のプロ野球パリーグの打撃成績をサンプルとして表示してあります。
そのまま GraphGenerate ボタンを押せば様子がわかると思います。Threshold の値を0.35
ぐらいにするといいかな。
(JWSじゃなければ、ファイルも読めるんだけど・・・・)
履歴
- 2006/4/26
- JTextArea にサンプルを初期表示。スクロールバーも出るようにする。辺には偏相関係数を表示するようにした。見にくいかな?
- 2006/4/25
- グラフィカルモデリングの勉強を兼ねてプロトタイプ作成。可視化はJUNGを使う。
posted at 02:14 |
category: /Math/Statistics |
固定リンク(Graphical Modeling
)
Mon, 17 Apr 2006
統計の分野で数量化理論として知られているのは、質的データを統計で扱うための手法。
- 数量化1類
- 説明変数が質的変数のときの回帰分析の方法
- 数量化2類
- 説明変数が質的変数のときの判別分析の方法
- 数量化3類
- 説明変数が質的変数のときに主成分分析のように変数の値が似たものをまとめる方法
などがある。下手に使うと簡単に逆説的なことが言えてしまうので、そのような変な例などを探してみることにする。
posted at 01:57 |
category: /Math/Statistics |
固定リンク(数量化理論
)
理数系のスタンダードなカリキュラムだと、確率論といっしょに簡単な推定と検定を勉強し、
その後抽象的な確率論(測度論)を勉強して、後は個別の解析対象に応じて勉強していく。
なので、実は社会科学における統計の使い方というのはあまり詳しくない。
というわけで少しずつ勉強していくことにする。
参考文献
- 『人文・社会科学の統計学』東京大学教養学部統計学教室(東京大学出版会)
- 『社会を読み解く数理トレーニング』松原望(東京大学出版会)
posted at 01:48 |
category: /Math/Statistics |
固定リンク(統計を勉強しなおす
)
Tue, 04 Apr 2006
スモールワールドネットワーク、スケールフリーネットワークなどに代表される近年話題の複雑ネットワークに関する情報、読書記録、アイディア、自作プログラムなどについてまとめておこうと思います。
参考文献
- 『複雑ネットワークの科学』増田直紀,今野紀雄(産業図書)
- 『スモールワールド』ダンカン・ワッツ(東京電機大学出版局)
- 『「複雑ネットワーク」とは何か』増田直紀,今野紀雄(講談社ブルーバックス)
posted at 02:24 |
category: /ComplexNetwork |
固定リンク(複雑ネットワークについて
)
Fri, 24 Mar 2006
多変数データを人間の顔の輪郭や鼻、口、目などであらわしたもの。18個までのパラメータを
表現できるとのこと(つまり18次元空間)。人間が顔の表情については微妙な違いも認識
しやすいことから、統計データの観測値の性質などを表情に対応させて比較する。
こういうちょっとした面白プログラムはきっと誰かが作って公開しているはず。
と思ったら、やっぱりありました。
自分のポートフォリオを登録しておいて、市場の値動きをチャーノフグラフで可視化して
メールで送ってくれたり、アイコンにしてブログに貼り付けたりできると面白いかもしれない。
posted at 02:10 |
category: /Math/Statistics |
固定リンク(チャーノフの顔グラフ
)
Thu, 23 Mar 2006
大きさNの母集団でAが成り立つ比率をπとするとき、
無作為抽出でn個のサンプルを取った時のAが成り立つ標本比率をpとする。
このとき、pの分散は、
V(p) = (N-n)/(N-1)・π(1-π)/n
で与えられる(この計算をエレガントにやるには??)。
nが十分大きい時は、中心極限定理でpが正規分布に従うと考えてよく、
信頼度95%で母集団比率を推定すると、ε=1.96√V(p) が絶対精度となる。
つまり、πがp±εの間にある確率が95%以上ということ。
有名な話で、ビデオリサーチ社はn=600世帯のサンプルで視聴率を推定しているが、
この場合の信頼度を計算してみると、N を十分大きいとして、(N-n)/(N-1)〜1
で近似して、πは10%=0.1としてみると、
V(p) 〜 0.1 * 0.9 / 600 = 0.00015
1.96√V(p) ≒ 0.024
となるので、信頼度95%の絶対精度は約2.4%。少なくとも小数点以下の数字は
ほとんど意味がないと言ってもいいだろう。
posted at 02:00 |
category: /Math/Statistics |
固定リンク(標本誤差の話
)
Mon, 06 Mar 2006
上位20%がリソースの80%を持つ。
さらにその上位20%だけの集合を考えても
同じ性質が成り立つ。そのような性質がべき法則
を満たす場合の特徴的な性質だといわれるが、
その場合の確率分布のべき指数γがいくら位になるかを計算してみよう。
べき法則を満たす確率変数(0<c≦x<∞)の確率密度関数をP(x)とした時、
yより大きな値を持つ確率 = P(>y) = 0.2 つまり、
∫y∞ P(x) dx = 0.2
となるような
yに対して、全体のリソースの80%を占めるということは、
∫y∞ xP(x) dx = 0.8 ∫c∞ xP(x) dx
を満たすので、これを解けばよい。結果は約 γ = 2.16 となる。
インターネットのノードの次数分布が大体これに当てはまる。
posted at 00:53 |
category: /Math/PowerLaw |
固定リンク(80:20の法則
)
べき分布の確率密度関数を平行移動したものを考える。
ある確率変数(c≦x<∞)の確率密度関数が
P(x) ∝ (x+α)-γ
のようなベキ関数に比例する場合を考える。
当然 c+α > 0 は成り立つ必要がある。
簡単な計算からすぐわかることは、
- γ>1のとき規格化するための係数は最小値cと平行移動の因子αを用いて、(γ-1)(c+α)γ-1と表され、γが1以下の場合は分布の積分は発散してしまう。
- γ>2のとき、平均値は収束して、(c+α)(γ-1)/(γ-2)-α である。
- γ>3のとき、分散は収束して、(c+α)2(γ-1)/(γ-2)2(γ-3) である。
となる。
ちなみにc=0のときに80:20の法則を満たすようなγを求めると、約γ = 2.41 になる。
posted at 00:51 |
category: /Math/PowerLaw |
固定リンク(ベキ分布を平行移動する
)
ここでは以前に教育または研究目的で作成したプログラム、プライベートで作ったプログラムを置いています。ただいま整理中です。
リンクする場合は
URL は http://www.tokunagakenichi.net/Program/
でお願いします。
posted at 00:49 |
category: /Program |
固定リンク(プログラム集
)
厳密な複雑ネットワークの定義があるというわけではなく、インターネット、人間関係、ニューラルネット、たんぱく質の化学反応系などの、「複雑な」ネットワークについての総称であると考えたらよさそうだ。
ネットワークを分析する手段として、多くの場合、いわゆる数学で言うところのグラフ理論で扱う「グラフ」(ノード、頂点、点などと呼ばれるものを、辺、エッジ、リンクなどと呼ばれるもので結んだ関係を表す)を用いる。
グラフ理論の応用として通常考えられるのは、ネットワーク構造がすでに与えられているものとして、最短経路問題や彩色問題などグラフの上での定義された問題を解くことに重点を置かれているのに対し、複雑ネットワークの立場では、平均ノード間距離や、次数分布などネットワーク構造そのものの性質、またある性質を持つネットワークがどのように作られるかという生成過程に重点が置かれているようだ。
posted at 00:47 |
category: /ComplexNetwork |
固定リンク(複雑ネットワークとは
)
スケールフリーネットワークとは、次数分布がベキ則に従うものをいう。
次数分布とは、それぞれのノードに対していくつのリンクがでているか(次数)
を調べて、次数kを持つようなノードの個数の(相対)度数分布p(k)のことである。
それがベキ関数に比例
p(k) ∝ k-γ
するときにベキ則に従う、という。
posted at 00:45 |
category: /ComplexNetwork |
固定リンク(スケールフリーネットワークとは
)
「はてな」アンテナをはじめてみることにしました。
tkenichiのアンテナ
はてなダイアリーもはじめました。
tkenichiの日記
はてなの方が検索には引っかかりやすいみたい。
日記系のコンテンツを2つ持つことの
意義はないのかもしれないのだけれど、こちらはコメントやトラックバックは
切ってあるので、そう言うものを積極的にやる場と消極的に細々と続ける場を
使い分けようかな、と言うのがきっかけですが、どう進展するかは??
2006/3/5 追加
こちらは blog としてよりも、html をまじめに書かずに済む、という機能を使って、
今までのコンテンツおよびプログラム、雑文などを時系列とカテゴリーで分類して
置いておく、という趣旨にします。
posted at 00:41 |
category: /About |
固定リンク(「はてな」はじめる)
Sun, 05 Mar 2006
URL に CGI が現れないように変更してみました。
それと同時に 固定リンクの URL を category ベースにしてみました。
個別記事にリンクをしていただける場合は、下にある固定リンクでお願いします。
posted at 22:13 |
category: /About |
固定リンク(固定リンク の URL
)
Mon, 20 Feb 2006
調べたことなどを少しずつメモを残そう。
ある確率変数(0<c≦x<∞)の確率密度関数が
P(x) ∝ x-γ
のようなベキ関数に比例するときに、ベキ法則に従う、などという。
簡単な計算からすぐわかることは、
- γ>1のとき規格化するための係数は最小値cを用いて、(γ-1)cγ-1と表され、γが1以下の場合は分布の積分は発散してしまう。
- γ>2のとき、平均値は収束して、c(γ-1)/(γ-2) である。
- γ>3のとき、分散は収束して、c2(γ-1)/(γ-2)2(γ-3) である。
ネットワークのノードの次数分布でべき法則に従うものとして知られているものの、
理論値および観測値は、以下の通り。
| ネットワークの種類 |
ガンマの値 |
| WWW |
1.9〜2.7 |
| インターネット |
2.1〜2.5 |
| 映画俳優の共演ネットワーク |
2.3〜3.1 |
| バラバシ・アルバートモデル |
3 |
実世界のモデルでは確率変数の区間は無限大まで広がっておらず、
有限のところで切れているので、平均値や分散も計算することができるが、
理論上(区間の上限を無限大にした時の極限)を考えると、
散らばり具合の指標として、分散に替わるものが必要になってくる。
posted at 00:10 |
category: /Math/PowerLaw |
固定リンク(ベキ則について
)
Sun, 19 Feb 2006
IndexedGeometryArray で TEXTURE_COORDINATE_2を指定する場合
テクスチャーに使う画像は Appearance の setTexture で与える。
IndexedGeometryArray の中で行うことは
- setTextureCoordinate() でテクスチャーに使う画像上の点に番号をつける。
- setTextureCoordinateIndex() で上で付けた点と setCoordinateIndex() で番号づけした点との対応を与える。
が全てである。
テクスチャーに使う画像上の点を与える方法
テクスチャーに使う画像の座標系は (s,t) で表され、画像の大きさにかかわらず、
0 から 1 までの値をとる。
例
下の例では、立方体の各面に画像を張り付けている。TexCoord2f[] t でテクスチャー画像上の点を
8個取り出して、setTextureCoordinateIndices() でそれを立方体の各頂点に対応させている。
立方体に張り付けるときに、大きさを自動的に変換していることに注意する。
import javax.media.j3d.*;
import javax.vecmath.*;
class DiceGeometry extends IndexedQuadArray{
double[] coord;
DiceGeometry(){
super(8,
IndexedLineArray.COORDINATES|
IndexedLineArray.TEXTURE_COORDINATE_2,
24);
coord = new double[3*8];
createGeometry();
setCoordinates(0,coord);
createTexture();
}
public void createGeometry(){
// 0
coord[0] = 0.5;
coord[1] = 0.5;
coord[2] = 0.5;
// 1
coord[3] = -0.5;
coord[4] = 0.5;
coord[5] = 0.5;
// 2
coord[6] = -0.5;
coord[7] = -0.5;
coord[8] = 0.5;
// 3
coord[9] = 0.5;
coord[10] = -0.5;
coord[11] = 0.5;
// 4
coord[12] = 0.5;
coord[13] = 0.5;
coord[14] = -0.5;
// 5
coord[15] = -0.5;
coord[16] = 0.5;
coord[17] = -0.5;
// 6
coord[18] = -0.5;
coord[19] = -0.5;
coord[20] = -0.5;
// 7
coord[21] = 0.5;
coord[22] = -0.5;
coord[23] = -0.5;
// index の設定
setCoordinateIndex(0,0);
setCoordinateIndex(1,1);
setCoordinateIndex(2,2);
setCoordinateIndex(3,3);
setCoordinateIndex(4,0);
setCoordinateIndex(5,4);
setCoordinateIndex(6,5);
setCoordinateIndex(7,1);
setCoordinateIndex(8,0);
setCoordinateIndex(9,3);
setCoordinateIndex(10,7);
setCoordinateIndex(11,4);
setCoordinateIndex(12,1);
setCoordinateIndex(13,5);
setCoordinateIndex(14,6);
setCoordinateIndex(15,2);
setCoordinateIndex(16,5);
setCoordinateIndex(17,4);
setCoordinateIndex(18,7);
setCoordinateIndex(19,6);
setCoordinateIndex(20,2);
setCoordinateIndex(21,6);
setCoordinateIndex(22,7);
setCoordinateIndex(23,3);
}
public void createTexture(){
TexCoord2f[] t = new TexCoord2f[8];
t[0] = new TexCoord2f(0.5f, 0.5f);
t[1] = new TexCoord2f(0f, 0.5f);
t[2] = new TexCoord2f(0f, 0f);
t[3] = new TexCoord2f(0.5f, 0f);
t[4] = new TexCoord2f(1.0f, 0.5f);
t[5] = new TexCoord2f(0.5f, 0.5f);
t[6] = new TexCoord2f(0.5f, 0f);
t[7] = new TexCoord2f(1.0f, 0f);
setTextureCoordinates(0, 0, t);
int ind[] = new int[]{0,3,2,1,
7,6,5,4,
1,2,3,0,
5,4,7,6,
2,3,0,1,
2,7,4,1};
setTextureCoordinateIndices(0, 0, ind);
}
}
posted at 16:55 |
category: /Java/Java3DTips |
固定リンク(テクスチャーの貼り付け方)
Picking した物体の座標を得るには
com.sun.j3d.utils.picking.behaviors.PickingCallback
インターフェースを使うと良い。
PickRotateBehavior や PickTranslateBehavior には
setupCallback() メソッドがあるので、それを使って、
結びつける。すると、Picking した TransformGroup の値が変化したときには
setupCallback(PickingCallback callback) によって結びつけられた callback
の transformChanged() メソッドが実行される。
ActionListner と使い方は似ているので、比較してみると分かりやすいかもしれない。
| インターフェース名 |
ActionListener |
PickingCallback |
| 点火元と結びつけるメソッド |
addActionLisnter() |
setupCallback() |
| 動作を定義するメソッド |
actionPerformed() |
transformChanged() |
PickCallback を継承したクラスを作成し、その中の transformChanged()
メソッドの中に実際の処理を書く。そして、PickTranslateBehavior などの
インスタンスに setupCallback() メソッドでこのクラスのインスタンスを
結びつければ良い。
例えば Picking された TransformGroup の座標を調べるには
PickTranslateBehavior pickTrans
= new PickTranslateBehavior(scene,this,bounds);
pickTrans.setupCallback(new PickingCallback(){
Vector3d vect = new Vector3d(); // 座標を格納する
Transform3D t3d = new Transform3D();
public void transformChanged(int type,TransformGroup tg){
if(type == PickingCallback.TRANSLATE){
tg.getTransform(t3d);
t3d.get(vect);
// ここで座標の処理をする。
}
}
});
のようになる。単に座標を表示するだけのプログラムをサンプルとして下に挙げる。
posted at 16:54 |
category: /Java/Java3DTips |
固定リンク(Picking した物体の座標を得るには)
天球のシミュレーション (Java Web Start)
恒星の位置を取得して、プラネタリウムのようなものを Java3D
で作ってみました。6等星まで表示するようになっています。
恒星のデータは外部のXMLファイルで記述してあります。
履歴
- 2003/6/22
- 恒星の位置情報をXMLファイルで記述して、直径20の球面上に
星を配置してプラネタリウムのようなものを作る。
参考リンク
posted at 16:44 |
category: /Program |
固定リンク(プラネタリウム)
花火のシミュレーション (Java Web Start)
夏の風物詩といえば花火ですが、それを Java3D でシミュレーションしようと思う。
できれば玉にどのように火薬を詰めるか、
どの方向に爆発させるかなどについえもシミュレーションできるようにしたい。
種類
よく言われる打ち上げ花火(正確には「打ち上げ玉」)の中にも、
割物、ポカ物、昇り曲、仕掛け花火などがあり、
代表的な割物の中にも、菊、牡丹、冠、千輪、などがある。
詳しくは参考文献を見てほしい。
色
色は金属の炎色反応で決まる。
紅色は炭酸ストロンチウム、緑色は硝酸バリウム、
黄色はシュウ酸ソーダ、青色は酸化銅、
白色はアルミニウムなどを使うらしい。
シミュレーション
花火を飛ばすための「割薬」と、光を出すための「星」を
「玉皮」の中に詰めることによって、玉ができる。
Java3D によるシミュレーションではこの玉を BranchGroup とし、
そのなかにいろいろな星を Shape3D として
addChild することにする。
適当なキーを押すと開始し、スペースキーを押すと止まります。
マウスによって、視点を動かせるので、花火が上がっている中を小型セスナで
アクロバット飛行をする気分が味わえます。
参考文献
posted at 16:34 |
category: /Program |
固定リンク(花火のシミュレーション)
物体を選択してマウスで動かしたりするには、PickMouseBehavior のサブクラス
を使う。
- 回転させる PickRotateBehavior
- 動かす PickTranslateBehavior
- ズームする PickZoomBehavior
これらは Java3D 1.2 以前では com.sun.j3d.utils.behaviors.picking パッケー
ジに入っていたが、1.2 からは com.sun.j3d.utils.picking.behaviors パッ
ケージに入っている。ここでは新しい方
(com.sun.j3d.utils.picking.behaviors)を使おう。
以下では物体を選んで回転させる方法について解説する。
PickRotateBehavior の部分を他のクラスに変えれば、他も同様にできる。
やるべきことは簡単で、PickRotateBehavior のインスタンスを作成し、
BranchGroup に addChild すればよい。Picking を有効にしたい Node を
あらかじめ setCapability(TransformGroup.ENABLE_PICK_REPORTING) によって
属性を変えておくことを忘れずに。
// ..... 途中から
Canvas3D canvas = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
BranchGroup scene = new BranchGroup();
TransformGroup[] trBox = new TransformGroup[2];
for(int i=0;i<trBox.length;i++){
trBox[i] = new TransformGroup();
trBox[i].setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
trBox[i].setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
trBox[i].setCapability(TransformGroup.ENABLE_PICK_REPORTING);
trBox[i].addChild(new ColorCube(0.1f));
}
BoundingSphere bounds = new BoundingSphere(new Point3d(), 100.0);
// 立方体を別々に動かすためのピッキング
pickRot = new PickRotateBehavior(scene,canvas,bounds);
scene.addChild(pickRot);
// ..... 以下略
上の例では、trBox[0]、trBox[1] が Picking 可能になっている。
そこに立方体が addChild されているので、最後の2行によって、
立方体を Picking によって個別に回転することができる。
posted at 16:19 |
category: /Java/Java3DTips |
固定リンク(Picking するには)
物体を選択したときの動作を自分で定義するには、
com.sun.j3d.utils.picking.behaviors.PickMouseBehavior を自分で拡張する。
PickMouseBehavior は抽象クラスで、updateScene(int xpos,int ypos) メソッ
ドが抽象メソッドであるから、これを拡張する。ここでは Picking した物体
の座標を表示するプログラムを取り上げてみる。
PickMouseBehavior には pickCanvas と言うフィールドがある。
このクラスの setShapeLocation(xpos,ypos) と
pickClosest() メソッドを使ってマウスをクリックした点に一番近い物は何かを
を調べることができる。pickClosest() は調査の結果を PickResult クラスで返
すので、実際に Node を取り出すには、PickResult クラスの getNode() メソッ
ドを用いる。雛型は次の通り。
public void updateScene(int xpos,int ypos){
TransformGroup tg = null;
// マウスの座標を与える
pickCanvas.setShapeLocation(xpos,ypos);
// マウスの位置に一番近いノード
PickResult res = pickCanvas.pickClosest();
if(res != null){
// 何かが Picking されているときには
// その TransformGroup を取り出す
if(((tg = (TransformGroup)res.getNode(PickResult.TRANSFORM_GROUP)) != null) &&
(tg.getCapability(TransformGroup.ALLOW_TRANSFORM_READ)) &&
(tg.getCapability(TransformGroup.ALLOW_TRANSFORM_WRITE))){
// ここで tg についての処理を行う
}
}
}
今の場合は、tg についての処理のところで、getTransform() で座標を取り出し、
それを TextField に書き込んでいる。
posted at 16:16 |
category: /Java/Java3DTips |
固定リンク(Picking をカスタマイズするには)
Java3D 付属の Picking ではマウスで物体を選択することはできるが、
それを動かすときに、マウスカーソルに追従させることはできない。
それを可能にするための Behavior を書き直してみた。
もちろんx座標とy座標方向にしか動かすことはできない。
z座標方向は画面と垂直なので、マウスカーソルの位置で奥行を
変化させることはできないため。
また、Picking した物体がぶら下がっている TransformGroup を
動かしたときに標準の Picking では違った方向に動く仕様になっているが、
それも大域座標で計算しなおすような仕様に変更してある。
以下にソースを挙げる。使いかたは、PickingTranslateBehavior とほぼ同じ。
ただ、コンストラクタの引数の順番が異なる。
/**
* @author TOKUNAGA Ken-ichi
* @version Time-stamp: <03/02/28 03:17:20 tkenichi>
*
* 物体をピッキングして、それをマウスカーソルに追従させる。
*/
import com.sun.j3d.utils.picking.*;
import com.sun.j3d.utils.picking.behaviors.*;
import com.sun.j3d.utils.behaviors.mouse.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.media.j3d.*;
import javax.vecmath.*;
public class MouseDragBehavior extends Behavior
implements MouseBehaviorCallback{
Vector3d currV3d = new Vector3d(),diffV3d = new Vector3d();
Point3d cursorP3d = new Point3d(),viewP3d = new Point3d();
Vector4d currV4d = new Vector4d();
private PickingCallback callback = null;
private PickCanvas pickCanvas;
private WakeupOr wakeupCondition;
private boolean picked = false;
// ピッキングした座標を格納する
private TransformGroup currGrp;
private Transform3D
currT3d = new Transform3D(), // ピッキングした座標
localT3d = new Transform3D(), // 局所座標
inverse = new Transform3D(), // 逆変換
plate2world = new Transform3D(); // imageplate から仮想空間への変換
public MouseDragBehavior(Canvas3D canvas,
BranchGroup root,
Bounds bounds){
currGrp = new TransformGroup();
currGrp.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
currGrp.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
currGrp.setCapability(TransformGroup.ALLOW_LOCAL_TO_VWORLD_READ);
// Behavior は Leaf だからその上の BranchGroup につける
root.addChild(currGrp);
pickCanvas = new PickCanvas(canvas, root);
pickCanvas.setMode(PickCanvas.BOUNDS);
setSchedulingBounds(bounds);
}
public void setMode(int pickMode) {
pickCanvas.setMode(pickMode);
}
public int getMode() {
return pickCanvas.getMode();
}
public void setTolerance(float tolerance) {
pickCanvas.setTolerance(tolerance);
}
public float getTolerance() {
return pickCanvas.getTolerance();
}
public void initialize() {
// マウスを押したとき、離したとき、ドラッグしたときに
// 起動する
WakeupCriterion[] conditions = new WakeupCriterion[3];
conditions[0] = new WakeupOnAWTEvent(MouseEvent.MOUSE_DRAGGED);
conditions[1] = new WakeupOnAWTEvent(MouseEvent.MOUSE_PRESSED);
conditions[2] = new WakeupOnAWTEvent(MouseEvent.MOUSE_RELEASED);
wakeupCondition = new WakeupOr(conditions);
wakeupOn(wakeupCondition);
}
public void processStimulus (Enumeration criteria) {
WakeupCriterion wakeup;
AWTEvent[] evt = null;
int xpos = 0, ypos = 0;
MouseEvent mevent;
// AWTEvent を取り出す
while(criteria.hasMoreElements()) {
wakeup = (WakeupCriterion)criteria.nextElement();
if (wakeup instanceof WakeupOnAWTEvent)
evt = ((WakeupOnAWTEvent)wakeup).getAWTEvent();
}
// MouseEvent の場合
if (evt[0] instanceof MouseEvent){
mevent = (MouseEvent) evt[0];
// マウスカーソルの2次元ピクセル座標
xpos = mevent.getPoint().x;
ypos = mevent.getPoint().y;
switch(mevent.getID()){
case MouseEvent.MOUSE_PRESSED:
// 押されたとき
System.out.println("mouse pressed");
// ピッキングする
if (!mevent.isAltDown() && mevent.isMetaDown()){
pickingTransformGroup(xpos,ypos);
}
break;
case MouseEvent.MOUSE_RELEASED:
// 離したとき
// ピッキングをやめる
picked = false;
break;
case MouseEvent.MOUSE_DRAGGED:
// ドラッグしたとき
// ピッキングされた TransformGroup を動かす
if (picked && !mevent.isAltDown() && mevent.isMetaDown()){
translate(xpos,ypos);
}
break;
default:
System.out.println("other event");
}
}
wakeupOn (wakeupCondition);
}
// ピッキングして TransformGroup を currGrp に格納する
private void pickingTransformGroup(int xpos,int ypos){
TransformGroup tg = null;
// PickCanvas をつかってピッキングしているノードを探す
pickCanvas.setShapeLocation(xpos, ypos);
// LineArray と Vertex の両方が重なっている場合も
// Vertex を取り出すために、pickAll() で全て取り出す
PickResult pr[] = pickCanvas.pickAll();
if(pr != null){
for(int i=0;i<pr.length;i++){
System.out.println(i + " = " + pr[i].getNode(PickResult.GROUP));
// ピッキングした結果が読み書き可能な TransformGroup を取り出す
if ((pr[i] != null) &&
((tg = (TransformGroup)pr[i].getNode(PickResult.TRANSFORM_GROUP))
!= null) &&
(tg.getCapability(TransformGroup.ALLOW_TRANSFORM_READ)) &&
(tg.getCapability(TransformGroup.ALLOW_TRANSFORM_WRITE))){
System.out.println("success to pick " + tg);
picked = true;
// ピッキングした結果の参照を currGrp にセットする
currGrp = tg;
// 物体が乗っている座標系とその逆変換を得る
currGrp.getLocalToVworld(localT3d);
System.out.println(localT3d);
inverse.invert(localT3d);
System.out.println(inverse);
// ImagePlate から仮想空間への変換行列を得る
pickCanvas.getCanvas().
getImagePlateToVworld(plate2world);
// 視点の位置を得る
pickCanvas.getCanvas().getCenterEyeInImagePlate(viewP3d);
plate2world.transform(viewP3d);
// マウスカーソルの位置に物体を合わせる
translate(xpos,ypos);
// freePickResult(pr);
}
}
}
}
private void translate(int xpos,int ypos){
// マウスカーソルのimageplate上の位置を得る
pickCanvas.getCanvas().
getPixelLocationInImagePlate(xpos,ypos,cursorP3d);
plate2world.transform(cursorP3d);
// ピッキングした物体の座標を通る
currGrp.getTransform(currT3d);
currT3d.get(currV3d);
currV4d.set(currV3d.x,
currV3d.y,
currV3d.z,
1);
localT3d.transform(currV4d);
currV3d.set(currV4d.x,
currV4d.y,
currV4d.z);
//System.out.println("cursor = " + cursorP3d);
//System.out.println("current = " + currV3d);
// 物体の座標をマウスカーソルの位置にあわせる
// view と垂直方向な平面上を移動する
currV3d.sub(viewP3d);
cursorP3d.sub(viewP3d);
double alpha =
(currV3d.x * viewP3d.x +
currV3d.y * viewP3d.y +
currV3d.z * viewP3d.z) /
(cursorP3d.x * viewP3d.x +
cursorP3d.y * viewP3d.y +
cursorP3d.z * viewP3d.z);
currV3d.scaleAdd(alpha,cursorP3d,viewP3d);
// 大域座標を局所座標に直す
currV4d.set(currV3d.x,
currV3d.y,
currV3d.z,
1);
inverse.transform(currV4d);
currV3d.set(currV4d.x,
currV4d.y,
currV4d.z);
currT3d.setTranslation(currV3d);
currGrp.setTransform(currT3d);
transformChanged(MouseBehaviorCallback.TRANSLATE,
currT3d);
}
public void setupCallback(PickingCallback callback){
this.callback = callback;
}
public void transformChanged(int type,Transform3D transform){
if(callback != null){
callback.transformChanged(type,currGrp);
}
}
}
posted at 16:14 |
category: /Java/Java3DTips |
固定リンク(Picking した物体を Drag するには)
絡み数の簡易計算 (Java Web Start)
絡み数を計算するプログラム。多角形を三角形に分割して
それぞれの三角形で絡み目を計算してそれらを足しています。
三角形同士が干渉しあうことの判定はもっと速いものもあるでしょうが、
ここでは正確さを重視しています。
履歴
- 2004/11/07
- とりあえずバージョン。四角形に対して三角形を動かした場合に
絡み数を随時計算するようにする。
使い方
マウスでグリグリしてください。
白い三角形が動きます。赤い四角形との絡み目を計算して表示します。
視点は変えられません。表示された辺で上下関係は見てください。
posted at 16:02 |
category: /Program/Knot |
固定リンク(絡み目の計算
)
輸送問題をステップ実行するプログラム(Java Web Start)
m個のの供給地からn個の需要地へ物資を輸送する場合、
各供給地から需要地への輸送費と各供給地の供給量、
各需要地の需要量が与えられているとき、
どの供給地から需要地にどれだけ物資を輸送するのがコストが最も少なくなるか。
この問題を考えるのが輸送問題である。
このプログラムではそれを飛び石法を用いて解くことにする。
まず供給地の個数と需要地の個数を入力する。
するとコスト表と輸送量の表が現れる。
その表に必要な係数を入力して、「次のステップ」ボタンを押すと、
標準的な手順にしたがって、飛び石法で解を求めていく。
飛び石法で基底変数を変換する場合、そのループの場所の色を変えています。
輸送量の表の右下のセルに全輸送コストを表示しています。
解が退化する場合はメッセージを出して終了します。
その場合は供給量、需要量を摂動させて
もう一度始めから解いて下さい。
posted at 15:31 |
category: /Program/OR |
固定リンク(輸送問題
)
PERT Simulator(Java Web Start)
いくつかの作業をまとまりとして見るときそれをプロジェクトと言い、
作業リストからプロジェクトの日程計画をたてることを考える。
作業リストにはその作業を始めるのに既に終了しておかなくてはならない
作業(先行作業)と、所要時間から構成される。このときそれぞれの作業が
いつから始めることが可能か、余裕があるかどうかを調べる。
ここでは作業リストを与えて、次のものを求める。
- 最早開始時刻(ES)
- 最早終了時刻(EF)
- 最遅開始時刻(LS)
- 最遅終了時刻(LF)
- 全余裕(TF)
- 自由余裕(FF)
まず最初の画面では作業の個数を選択する。次に作業リストを与える表が現れるので、
所要時間を記入し、先行作業のところにチェックをいれる。その後、『PERT実行』
と言うボタンを押せば上の値を求めて表として表示する。
まだ日程計画としてつじつまがあっていないとき
(先行作業をたどって行くとループになるときなど)
の例外処理はしていない。最悪無限ループに陥る可能性がある。
また、ダミー作業を挿入する方法が一意でないときの処理も
いい加減である。その辺は注意して利用してほしい。
ひょっとしたらバグが残っているかもしれない。
見つけた人は教えてほしい。
posted at 15:20 |
category: /Program/OR |
固定リンク(PERT
)
シンプレックス法をステップ実行するプログラム(Java Web Start)
初めの画面では変数の個数と条件式の個数を入力する。
変数はスラック変数も含める。条件式は目的関数は含めない。
[ENTER] ボタンを押すと、シンプレックス表の画面に切り替わる。
ここで、シンプレックス表を入力する。左端の行は目的関数 (z)
の係数、右端は定数を入力する。[STEP] を押すと1段階ごとに
シンプレックス法を実行する。[RESET] を押すと、はじめの画面に戻る。
実行するときに実行可能基底解を表す表からはじめなければ、正しい答えは保証
されません。2段階シンプレックス法や罰金法などを用いて調整して下さい。
一般的な流儀では定数項を一番左に書いたり、目的関数を一番上に書いたりする
かも知れませんが、その場合は適宜読みかえて下さい。
posted at 15:15 |
category: /Program/OR |
固定リンク(シンプレックス法
)
ベータ分布乱数生成プログラム(Java Web Start)
ベルヌイ分布に関するベイズ推測を行うと、
事後分布としてベータ分布が現れる。そこでベータ分布の
勉強をかねて、乱数生成プログラムを作成。
履歴
- 2003/11/03
- 乱数生成アルゴリズムおよび簡単なインタフェイス作成
実行形式
a,b の値を入力し、[SET PARAMETER] ボタンを押すと、
確率分布が更新される。START ボタンを押せば乱数が生成されます。結果はヒストグラム表示され
ます。試行回数によってヒストグラムの幅は自動的に調整されます。
これだけで終わっては仕方ないので、KL距離を計算したり、AIC を計算したりする
プログラムに発展させていきたいな。
posted at 15:04 |
category: /Program/Math |
固定リンク(ベータ分布
)
正規分布の数値計算(Java Web Start)
正規分布表が手元にないときに代わりに数値計算するプログラムです。
posted at 14:53 |
category: /Program/Math |
固定リンク(正規分布
)
平方剰余を計算するプログラム(Java Web Start)
いわゆる Legendre 記号を計算する。
posted at 14:42 |
category: /Program/Math |
固定リンク(平方剰余を求める
)
Sun, 12 Feb 2006
Behavior を Thread のように使ってアニメーションをするには
class TimerBehavior extends Behavior{
WakeupOnElapsedTime won;
public TimerBehavior(long sleep){
won = new WakeupOnElapsedTime(sleep);
}
public void initialize(){
wakeupOn(won);
}
// Thread.run() に相当
public void processStimulus(java.util.Enumeration criteria){
// ここで 3D の更新を行う
wakeupOn(won);
}
}
のような Behavior を継承したクラスを作成して addChild すればよい。
実行すると、sleep ミリ秒毎に 3D の更新を行ってアニメーションのように見える。
ただしこのままだと、動きっぱなしで制御することができない。
ボタンによって Behavior を On/Off するには postId() メソッドを用いて、
次のようにする。
- Behavior の WakeupOnCriterion を WakeupOnElapsedTime と
WakeupOnBehaviorPost の2種類用意する。
- さらに現在どちらの WakeupOnCriterion を使っているかを判別するための
flag を準備する。ここでは true のとき WakeupOnElapsedTime を呼ぶこと
にする。
- initialize() の中で、
wakeupOn() に WakeupOnBehaviorPost クラスのインスタンスをセットし、
flag を false にする。
- processStimulus() メソッドで flag の値にしたがって、
次に wakeupOn() する WakeupOnCriterion を変更する。
Behavior の wakeupOn() は外から呼ぶことはできないが、postId()
は外から呼ぶことができる。Behavior を On するには、
- flag を true にする。
- この Behavior クラスのインスタンスの postId() メソッドを呼ぶ。
とすればよく、Off するには、
だけでよい。
具体例で言うと、Behavior のほうは
class TimerBehavior extends Behavior{
private WakeupCriterion awtWakeon,timeWakeon;
boolean flag; // true のときは timeWakeon を待つ
public TimerBehavior(long time){
timeWakeon = new WakeupOnElapsedTime(time);
awtWakeon = new WakeupOnBehaviorPost(this,
MouseEvent.MOUSE_CLICKED);
}
public void initialize() {
wakeupOn(awtWakeon);
flag = false;
}
public void processStimulus(java.util.Enumeration criteria) {
if(flag){
// ここでアニメーションの処理をする
wakeupOn(timeWakeon);
}else{
wakeupOn(awtWakeon);
}
}
}
のようにする。
TimerBehavior のインスタンスを behavior とするとき、
呼び出すメソッドは VirtualUniverse や Applet のなかに
public void stopBehavior(){
behavior.flag = false;
}
public void startBehavior(){
behavior.flag = true;
behavior.postId(MouseEvent.MOUSE_CLICKED);
}
のように記述する。このメソッドをボタンを押したときの
actionPerformed() で呼べばよい。
posted at 22:16 |
category: /Java/Java3DTips |
固定リンク(Java3D Behavior をボタンで On/Off するには)
Material の属性の意味。
- ambient 周囲の色
- diffuse 反射の色
- emissive 放射する色
- specular 鏡の色
posted at 22:14 |
category: /Java/Java3DTips |
固定リンク(Java3D Material)
Transform3D ではその状態を、4行4列の行列、3行3列の行列、3次元のベクトル、
4元数で設定することができます。それぞれの間の関係をまず調べてみます。
4行4列の行列が一番情報量が多いので、おそらく4行4列の行列で表現すれば
いいはず。set() メソッドがその他の形式から4行4列の行列への写像を与えてい
ると考える。
- スカラーから set(double scale)
s -> [s 0 0 0]
[0 s 0 0]
[0 0 s 0]
[0 0 0 1]
- 3次元ベクトルから set(Vector3f trans)
[x0] -> [1 0 0 x0]
[x1] [0 1 0 x1]
[x2] [0 0 1 x2]
[0 0 0 1 ]
- スカラーと3次元ベクトルから set(double scale, Vector3d v1)
s,[x0] -> [s 0 0 x0]
[x1] [0 s 0 x1]
[x2] [0 0 s x2]
[0 0 0 1 ]
- 3次元ベクトルとスカラーから set(Vector3d v1,double scale)
[x0],s -> [s 0 0 s*x0]
[x1] [0 s 0 s*x1]
[x2] [0 0 s s*x2]
[0 0 0 1 ]
- 3行3列の行列から
[m00 m01 m02] -> [m00 m01 m02 0]
[m10 m11 m12] [m10 m11 m12 0]
[m20 m21 m22] [m20 m21 m22 0]
[0 0 0 1]
4元数は Quat4d では、フィールド x、y、z、w で表しているが、これは
数学の書き方をすると、
(x,y,z,w) = w + xi + yj + zk = q
である。4元数 q の随伴表現で、4元数の虚成分
(Sp(1)のリー環)に作用したものと考える。すなわち
4元数 q が3次元ベクトル v = (v1,v2,v3) に対して
q(v) = q v q-1
で作用する。この作用は q に対して一意ではないことに注意する。
これが set(Quat4d q) に他ならない。
[x] -> [(x*x-y*y-z*z+w*w)/r 2*(x*y-w*z)/r 2*(x*z+y*w)/r 0]
[y] [2*(x*y+w*z)/r (-x*x+y*y-z*z+w*w)/r 2*(y*z-x*w)/r 0]
[z] [2*(x*z-y*w)/r 2*(y*z+x*w)/r (-x*x-y*y+z*z+w*w)/r 0]
[w] [0 0 0 1]
ただし r = x*x + y*y + z*z + w*w となる。
posted at 22:12 |
category: /Java/Java3DTips |
固定リンク(Java3D Transform3D の set メソッドの具体的仕様)
Behavior とは抽象クラスで、initialize() と processStimulus() メソッド
を実装して用いる。これも Java3D の Node を継承しているので、
木構造に addChild() して使う。
initialize() は初期化をする。
processStimulus() は wakeupOn(WakeupCriterion criteria) によって
設定された起動条件 criteria が満たされたときに呼ばれるメソッド。
普通 initialize() のなかで wakeupOn() を呼び出し、最初の起動条件を
設定する。接待条件を満たすたびに processStimulus() を実行したいときは
processStimulus() の中で再度 wakeupOn() を呼び出す。
criteria で記述された条件や processStimulus() で記述された動作によって
アニメーションやマウスやキーボードなどのユーザインターフェースを
実現することができる。
実は PickMouseBehavior や Interpolator も Behavior の継承クラス。
Behavior で Animation をするには
WakeupCriterion に指定時間の経過後に起動する WakeupOnElapsedTime
もしくは Frame が描き終わったときに起動する WakeupOnElapsedFrame
を使うとよい。
posted at 22:09 |
category: /Java/Java3DTips |
固定リンク(Java3D Behaviorについて)
jar でクラスファイルを固めるには
ほぼ tar コマンドと同じように使えばよい。
$ jar cvf jarfile classfiles
jar で固めたファイルをアプレットタグに使うには
<APPLET CODE="MainApplet" ARCHIVE="hogehoge.jar" WIDTH="800" HEIGHT="500" >
のように ARCHIVE パラメータを設定する。
jar で固めたファイルを実行するには
まず、jar で固めるときに manifest ファイルを指定して
どのクラスの main メソッドを実行するかを指定する。
例えば MainClass と言う名前のクラスの main メソッドを実行する場合は
manifest ファイルは次のように書く。
Manifest-Version: 1.0
Created-By: 1.3.1 (Sun Microsystems Inc.)
Main-Class: MainClass
これを適当な名前で保存して、jar で固めるときに次のように
$ jar cvfm jarfile manifestfile classfiles
このファイルを指定する。
実行するときには、java コマンドの -jar オプションをつければよい。
$ java -jar jarfile
このときはクラス名をつける必要はない。クラス名は jar ファイルの中の
manifest ファイルの情報から自動的に取り出される。
posted at 22:07 |
category: /Java/tips |
固定リンク(jar の使い方)
Canvas3D の画面をキャプチャーして、
BufferedImage に代入するには、Canvas3D クラスの適当なメソッドの中で
BufferedImage image = new BufferedImage(getSize().width,
getSize().height,
BufferedImage.TYPE_INT_ARGB);
ImageComponent2D imageComponent =
new ImageComponent2D(ImageComponent.FORMAT_RGB, image);
Raster raster= new Raster(new Point3f(-1.0f, -1.0f, -1.0f),
Raster.RASTER_COLOR, 0, 0, image.getWidth(),
image.getHeight(), imageComponent, null);
getGraphicsContext3D().readRaster(raster);
image = raster.getImage().getImage();
のようにする。Raster は javax.media.j3d パッケージの Raster を使う。
getGraphicsContext3D().readRaster(raster);
と言う文で、GraphicsContext2D の内容を raster が参照している
ImageComponent2D に書き出す。メソッド名は read だが、実際には
書き出していることに注意する。
posted at 21:58 |
category: /Java/Java3DTips |
固定リンク(Canvas3D のイメージを取りだす)
Canvas3D の API のマニュアルには On-screen Rendering vs Off-screen Rendering
と言う記述があるが、ここで何を述べているかを調べよう。
- Off-screen か On-screen かはコンストラクタで指定する。
- 調べるには isOffScreen() メソッドを使う。
- Off-screen Canvas3D は Container に追加することはできない。
add() で追加しようとすると、new していても NullPointerException
が投げられる。
- setOffScreenBuffer() で OffScreen の画像を保存するための
Buffer の設定をする。
- renderOffScreenBuffer() すると、その Canvas3D がつながっている
View から見た VirtualUniverse の様子を setOffScreenBuffer で指定した
Buffer に保存する。これを実行した後に Buffer の内容を利用する。
Buffer にアクセスするには getOffScreenBuffer() を使う。
- renderOffScreenBuffer() を実行する前に、OffScreen の Screen3D の
Size と PhysicalScreenSize を設定しなければならない。
- postSwap() メソッドは Canvas3D が更新されるたびに呼ばれる。
したがって、別の画面に Canvas3D の更新結果を反映させたい命令は
この中に書く。ただし、かなり遅くなってしまうので、10回に1回
ぐらい更新するのがいいかもしれない。
posted at 21:57 |
category: /Java/Java3DTips |
固定リンク(Canvas3D の On-screen と Off-screen)
Java3D 1.3 より GeometryArray で setCoordRef3f(Point3f[] coords)
などの Point3f の配列の参照によって座標を設定することが
推奨されなくなった。かわりに J2SDK 1.4 より導入された
java.nio パッケージの Buffer クラスを用いた(継承したわけではない)
J3DBuffer クラスを用いて座標を設定する setCoordRefBuffer(J3DBuffer coords)
メソッドが追加されている。
これを用いてトーラスを作成した例を以下にあげる。
J3DBuffer オブジェクトを作成するときに、
対応する Buffer は ByteOrder を nativeOrder
として設定しなければエラーがでる。
class Torus extends Shape3D{
IndexedGeometryArray geometry;
int rad = 10;
int lng = 100;
Torus(){
geometry = new IndexedQuadArray
(rad*lng,
IndexedQuadArray.COORDINATES|
IndexedQuadArray.NORMALS|
IndexedQuadArray.BY_REFERENCE|
IndexedQuadArray.USE_NIO_BUFFER,
4*rad*lng);
double[] coord = new double[3*rad*lng];
float[] normal = new float[3*rad*lng];
double core = 0.1;
for(int i=0;i<lng;i++){
for(int j=0;j<rad;j++){
coord[3*(i*rad+j)]
= Math.cos((double)i*2*Math.PI/lng)
+ core * Math.cos((double)i*2*Math.PI/lng)
* Math.cos((double)j*2*Math.PI/rad);
coord[3*(i*rad+j)+1]
= Math.sin((double)i*2*Math.PI/lng)
+ core * Math.sin((double)i*2*Math.PI/lng)
* Math.cos((double)j*2*Math.PI/rad);
coord[3*(i*rad+j)+2]
= core * Math.sin((double)j*2*Math.PI/rad);
normal[3*(i*rad+j)]
= (float)(Math.cos((double)i*2*Math.PI/lng)
* Math.cos((double)j*2*Math.PI/rad));
normal[3*(i*rad+j)+1]
= (float)(Math.sin((double)i*2*Math.PI/lng)
* Math.cos((double)j*2*Math.PI/rad));
normal[3*(i*rad+j)+2]
= (float)(Math.sin((double)j*2*Math.PI/rad));
}
}
ByteOrder order = ByteOrder.nativeOrder();
DoubleBuffer indexedCoordBuffer
= ByteBuffer.allocateDirect(coord.length * 8)
.order(order).asDoubleBuffer();
indexedCoordBuffer.put(coord);
J3DBuffer j3dCoordBuffer = new J3DBuffer(indexedCoordBuffer);
geometry.setCoordRefBuffer(j3dCoordBuffer);
FloatBuffer indexedNormalBuffer
= ByteBuffer.allocateDirect(normal.length * 4)
.order(order).asFloatBuffer();
indexedNormalBuffer.put(normal);
J3DBuffer j3dNormalBuffer = new J3DBuffer(indexedNormalBuffer);
geometry.setNormalRefBuffer(j3dNormalBuffer);
int[] index = new int[4*rad*lng];
for(int i=0;i<rad;i++){
for(int j=0;j<lng;j++){
index[4*(rad*j+i) ] = rad*j+i;
index[4*(rad*j+i)+1] = rad*((j+1)%lng)+i;
index[4*(rad*j+i)+2] = rad*((j+1)%lng)+(i+1)%rad;
index[4*(rad*j+i)+3] = rad*j+(i+1)%rad;
}
}
geometry.setCoordinateIndices(0,index);
geometry.setNormalIndices(0,index);
setGeometry(geometry);
Appearance app = new Appearance();
Material mat
= new Material(new Color3f(0.0f, 0.0f, 0.0f), // ambient
new Color3f(0.0f, 0.0f, 0.0f), // emmisive
new Color3f(0.65f, 0.65f, 0.65f), // diffuse
new Color3f(0.45f, 0.45f, 0.45f), // specular
64f);
app.setMaterial(mat);
setAppearance(app);
}
}
DoubleBuffer を作るときは、double = 8 byte なので、
double の配列の大きさの 8 倍の大きさを確保する必要がある。
DoubleBuffer indexedCoordBuffer
= ByteBuffer.allocateDirect(coord.length * 8)
.order(order).asDoubleBuffer();
posted at 21:54 |
category: /Java/Java3DTips |
固定リンク(J3DBuffer の使用例)
複数の View を出力するために SimpleUniverse ではなく
VirtualUniverse を継承して作ることにしました。
そのための雛型です。
posted at 21:37 |
category: /Java/Java3D |
固定リンク(Java3D のいくつかの雛型
)
Alpha は 0.0 から 1.0 までの値を徐々に変化させるためのクラスだが、
value() によって得られる値はシステム時間によって変化する。
つまり、変化させるパラメータはシステム時間である。
時刻を与えて値を得るには value(long atTime) を使う。
以下に気がついた注意点を挙げておく。
- IncreasingAlphaRampDuration の値を IncreasingAlphaDuration の
半分よりも大きくしてしまうと、Alpha の値が不連続になってしまう。
- LoopCount の値は周期を与えると言うよりも、startTIme から
startTime + LoopCount * (IncreasingAlphaDuration + DecreasingAlphaDuration)
まで繰り返すと言う意味にとった方がよい。
INCREASING_ENABLE を false にしていても、IncreasingAlphaDuration
が 0 でなければその分を有効としてしまう。
また、AlphaAtOneDuration の値が0より大きくても繰り返し時間には
反映されないので注意する。
下手に使うと、不連続な値を与えることがある。
性質を調べるためのプログラムも作成したので下に置いておく。
Alpha(Java Web Start)
posted at 21:28 |
category: /Java/Java3DTips |
固定リンク(Alpha の性質
)
ジュリア集合を描く(Java Web Start)
マンデルブロー集合とならんで有名なフラクタル図形であるジュリア集合。
描画する複素平面の左上の点とその大きさを指定して
マンデルブロー集合を描画する。マウスによって拡大する領域を選択すること
も可能。左上の座標が x + yi でパラメータλ= a + bi です。
posted at 21:16 |
category: /Program/Math |
固定リンク(ジュリア集合
)
マンデルブロー集合を描く(Java Web Start)
有名なフラクタル図形であるマンデルブロー集合。
描画する複素平面の左上の点とその大きさを指定して
マンデルブロー集合を描画する。マウスによって拡大する領域を選択すること
も可能。
Save Image は Java Web Start では動きません。
posted at 21:07 |
category: /Program/Math |
固定リンク(マンデルブロー集合
)
パーコレーションのシミュレーション(Java Web Start)
平面上に絶縁体の結晶が正方形で並んでいるとしよう。
結晶がランダムに伝導体のものに変化していくとしよう。
そのとき、全体の結晶のうちどれくらいの結晶が伝導体になれば
上から下まで電気が流れるであろうか?ただし、上下左右に
接している結晶にのみ電気が流れるとする。
池の中に格子状に置かれた飛び石を飛んで、端から端に渡ることを考える。
格子全体のうちどれだけの割合で飛び石を置けば、渡ることができるように
なるだろうか?
もちろん一直線に並べれば、辺の長さ分の石を置けば十分だが、
石がランダムに配置されているときは、そんなにうまくはいかない。
上の2つの問題は本質的には同じ問題である。結晶や飛び石は
2次元の格子と考えればよい。通ることのできる格子点をランダムに
配置するとき、上から下まで通れるようになるにはどのくらいの割合の
格子が通れればよいかという問題になる。この問題を
サイトパーコレーションという。
2次元格子の通ることのできる辺がランダムに配置されているときの
問題をボンドパーコレーションと言うが、ここでは扱わない。
プログラム概説
格子のサイズを入力してSTARTボタンを押すとシミュレーションが開始します。
ただし、大きなサイズのものだと
実行にかなりの時間がかかるので注意。
上辺からたどり着くことのできる格子点を赤く表し、たどり着けないところを
黒で表している。下までたどり着けた場合は上から下までたどり着けた格子を
青で塗り直して終了する。
格子点の連結した塊をクラスタと言う。パーコレーションがおこった後で
クラスタの大きさとそれぞれの大きさのクラスタがいくつあるかを調べて
リストとして出力している。
パーコレーションが起こる割合はシミュレーションの結果平均約0.59である。
つまり59%の格子点が通れるようになったときに上から下までの道ができると
いうことである。また、クラスタ統計を見るとパーコレーションしたクラスタが
大半を占め、その他のクラスタはサイズがずっと小さくなっている。
posted at 20:49 |
category: /Program/Physics |
固定リンク(パーコレーション
)
古い書評のページを Blosxom のコンテンツに移しました。
ファイル更新日時まで変えていないのですが、URL にもとの
日付は残しています。
当時の担当していた学生向けに書いていたり、
勘違いがそのままだったりで、恥ずかしい部分もあるのですが、
そのまま載せちゃいます。
posted at 02:52 |
category: /About |
固定リンク(昔の書評を移動
)
これから計算物理を本格的に取りこもうという大学院生レベルに特にお勧め。
いろいろな科目で断片的に習う知識、例えばハードウェア、誤差論、数値積分、
微分方程式、固有値問題などが有機的に結びついて、研究の手法と方向性を
与えてくれる(はずの)とっても有用な本。
プログラミングにおける陥りやすいミス、誤差を少なくするための手法などを
読むと、私が今まで漠然とコーディングしてきたプログラムを、
見直してみたい気にさせられた。
読者はそれぞれ、それまでの学習の背景に従って、
良くわかる章と、ほとんどわからない章が混在していると思う。
そこで、ほとんどわからない章を熟読してほしい。
どの章も初学者でも馴染みのある例から本質に深く切り込んで行くので、
学びやすくなっている。手法の説明はかなり詳しく、プログラミングの素養があれば
すぐにでもコーディングできるだろう。
ただし、実際の物理の問題を多数扱っているわけではなく、プログラム例も少ない。
実例を期待している読者にはお勧めできない。
テキストとして一読しようとする読者か、
既にテーマを持っている人が、良い手法はないかと探そうとする場合は
役に立つだろう。
いずれにせよ、この分野を系統的に学習する成書はまだまだ少ないが、
数少ない中ではよいのではないだろうか。
内容:
- データ解析(実験データから最適な曲線を決める方法)
- 非調和振動(非線型な摂動が加わった場合)
- サブルーチンライブラリ(インターネット上の数値計算ライブラリの紹介)
などなど。
posted at 02:49 |
category: /book/2002 |
固定リンク(『計算物理学 基礎編』R.H.ランダウ 朝倉書店)
直前に読んだ「史上最大の発明アルゴリズム」とは対照的に、
カントールのひととなりを主題にして、一般人が漠然と理解している
「無限」の面白さ、難しさ、パラドックスを紹介している。
出てくる例は必要最小限でありながら、
エッセンスを理解しやすいように工夫されている。
もちろん「無限」をめぐる多彩な物語もドラマティックに語られていて、
数学基礎論の話を既によく知っている人でも、面白く読めると思う。
内容はギリシア時代の素朴な意味での「無限」の発見から、
ユダヤ教における無限の解釈、および無限に関する古典的な問題を
紹介した後、
実数の定義、対角線論法、アレフ、連続体仮説、選択公理など
集合論でおなじみの話が続く。不完全性定理とコーエンによる
証明のあたりが、この本のクライマックス。
それとほぼ同時進行で、カントールの伝記にもなっていて、
カントールの足跡をたどりながら、取り組んだ問題の説明をしていくと言う
書き方で、彼の業績がその当時どのように評価され、どのような影響を与えた
のかもよくわかる。
宗教的なところや、「無限」にかかわる人物の受難を強調し過ぎている
感はあるが、数学者の活動がいきいきと描写されており、一気に読んでしまっ
た。数学を勉強してみようと言う気持ちを高めてくれる本。
大学学部生ぐらいが読むと一番楽しめるかもしれない。
posted at 02:48 |
category: /book/2002 |
固定リンク(『「無限」に魅入られた天才数学者たち』アミール・D・アクゼル 早川書房)
自分の専門に近ければ近いほど、一般書の評価が厳しくなるのは
仕方がないかもしれない。知合いの経済学の先生は、経済小説は
全く面白くないと言っているし。
解説書でも、歴史を解説したものでも、
フィクションでもなく、それらが交錯して進展して行く不思議な書物。
しかし正直言って、何が言いたいのかよくわからない。
カントール、ゲーデル、チューリングらの業績を紹介したいのなら、
寄り道せずに、一歩一歩彼らが通った道筋をたどるべきだろう。
実際、そういう内容を期待して購入した。
しかし実際は、既に知っている人にとってはまどろこしい説明で、
初めて触れる人にはわかりにくい説明でしかない。
文学や歴史などのエピソードを交えながら、
主題があちらこちらに揺れるのは、ストレートに理解したいものに
とっては邪魔である。
数学基礎論の細かい議論のところを、あまり適切でない例をあげて
それで説明を済ましているところも多く、数学書としてはあまりお薦めできな
い。しかし「物語」としてなら楽しめるかもしれない。
posted at 02:47 |
category: /book/2002 |
固定リンク(『史上最大の発明アルゴリズム』デイヴィッド・バーリンスキ 早川書房)
題名の通り、ヘッジファンドの解説書ではなくて小説である。
ヘッジファンドとはいうまでもなく、個人の資金を投機的に
運用する投資信託であるが、そんな教科書的な説明よりも、
小説の中でその現場の様子をいきいきと表現することで、
実体を持つものとして読者に感じさせてくれる。
読み進めているうちに、自分がディーラーになったような興奮
が感じられる。作者の実際の経験からきているものだろう。
取り引き前の準備、実際の取り引き中のスピード感、
市場が思い通り動いたときの喜びと、
裏切られたときの落胆。これらが実に生々しく描写されている。
登場人物も少なく、性格設定も単純化されすぎているきらいはあるが、
それが小説の世界への没入を促進しているのかもしれない。
主人公が新入り者というのも、誰もが一度は感じたことのある
新しい世界への不安や、反発の気持ちを主人公との間で
共有しやすい。主人公に限らず、特にエンディングなどちょっと青臭いというか、
理想主義的なところもあるが、それも作者の現実の市場に対する
メッセージなのかもしれない。
とにかく一気に読める。また一気に読んで欲しい。
上質の、楽しめる、経済小説。
posted at 02:46 |
category: /book/2002 |
固定リンク(『小説ヘッジファンド』幸田真音 講談社文庫)
昔はコンピュータを使おうとすると、CPU やメモリ、I/O などを
意識しなければならなかったが、最近はそこまで意識しなくても
使えるようになっている。これはもちろん喜ばしいことだが、
反面、(とくに学生諸君は)ある特定のソフトウェアの使い方を
覚えただけで、コンピュータに詳しいような顔をしていて、
基本となっている技術をほとんど知らないのには驚かされる。
この本はそのような人にもわかりやすいように、
ハードウェアからソフトウェアまで一から詳しく書いてある。
設定画面ででてくる呪文のような言葉の意味もきっとこの本を
読み終わったときにはわかるようになっているだろう。
言葉の意味以外にも、基本的な動作のしくみ(題名通り!)は、
非常にわかりやすく説明されている。
メモリの使い方、データの圧縮、OSの説明などは、
今までなんとなくわかっていた人も、この本の丁寧で
簡潔な説明によりさらにその理解が深まるだろう。
また、2進数についての説明も詳しい。
学生諸君はこの本を読んで、コンピュータの中ではすべて2進数で
処理されているのだと言うことを、もっと常に意識してほしいと思う。
「ハードウェアのことなんか知らなくてもよい」
「ワード、エクセル、パワーポイントが使えれば充分」
と言う意見もあるだろうが、私はそうは思わない。
単なる消費者ではなくて、コンピュータを使って仕事をすることを
目指すならば、これくらいは常識の範囲にしておいてもらいたい。
『楽をするだけではダメです。なぜ楽ができるかを知ってから、楽をして下さい。』
という本文中の言葉を最後に引用しておきたい。
posted at 02:44 |
category: /book/2002 |
固定リンク(『プログラムはなぜ動くのか』矢沢久雄 著 日経BP)
著者らは実際の計算物理の専門家で、実際のシミュレーション結果や
大きな進展のきっかけとなった理論を多数挙げてあるので、専門外の人でも
計算物理の雰囲気はつかめるのではないだろうか。
それぞれの章は「もっと○○を」と言うかたちの副題が付いており、
例を挙げながらどのような点がネックになっているかが分かりやすく説明されている。
確かにその分野の物理の素養がないと理解しにくいかもしれない。
物理の理論屋さんや実験屋さんが計算機でシミュレーションしてみようと思って
読む場合がいちばん得るところが大きいのかもしれない。
しかし異分野の人間でも、最先端ではどこが問題になっているか、どのような理論で困難が
克服されたかを知るのは大事なことではないかと思う。特に最近は、コンピュータに
計算させれば何でもできると無邪気に考えている人が多いような気がするので、なおさらである。
すこし専門的な感想を言うと、計算物理が最も活躍する分野と思われる分子動力学のところ
にもうすこし詳しく説明してほしかった。自分の勉強不足を棚に上げていることは承知の上だが、
導入部分の後に、いきなりシミュレーション結果の紹介になっていたので、シミュレーションの
手法の紹介などを入れてほしかったような気がする。もちろん紙数の関係上しかたない部分もあるだろう。
実際にやってみる場合を考えて、数学ノートや参考文献が充実しているのはうれしい。
posted at 02:44 |
category: /book/2002 |
固定リンク(『計算物理の世界』大西楢平 他 著 共立出版)
実はこの本は第2版が出ている。初版は Java 1.1 時代に書かれた本なので、
ActionListener などはないし、その他古い書き方をしている部分も多くある。
したがってサンプルプログラムはそのままでは意図どおりには動かないことも多い。
また、題名に「アドバンスド」とあるように、内容はある程度 Java
のプログラミングになれた人を対象としており、説明もいくぶん抽象的である。
しかしそれでもこの本に価値を感じる。基本的なAPIを学習し、処理の仕組みの
解説を読んだところで、実際にそれを活用するプログラムを作成するまでには
大きな隔たりがある。この本はその隔たりを埋めるのにとても有用だ。
ソケットを用いたサーバとクライアントの作成方法、IDLやRMIを使った
プログラムにおける、ファクトリやコールバックの活用法など、
参考になる部分はかなり多い。
プログラミング言語の解説書は、そのAPIの解説に当てられているものが多く、
その厚さのわりには情報が少ないように感じられるものばかりだ。
それに対してこの本は、APIから一歩すすんで、
どのようにプログラムを構築していくかと言う
話を具体例をもとに展開している。基礎を押さえた段階からさらに進みたい人に
はよい本だろう。
繰り返すが、この本は第2版が出ている。買うならそちらを。
posted at 02:43 |
category: /book/2002 |
固定リンク(『アドバンスド JAVA ネットワーキング』パラシャント・スリドハルン 著 プレンティスホール)
ファイナンスが専門でない数学者が書いた金融工学の本。
ブラック・ショールズの方程式を目的としている。
数学の本は往々にして、論理的整合性を重視するあまり、
無味乾燥なものとなりがちだが、この本はむしろ著者が
理解していく道筋を記録したように書かれていて、とても読みやすい。
微分積分と、確率の知識があれば読み進めることができるのではないだろうか。
つまずきやすいところ、誤解しやすいところは、数式による説明の後に、
わかりやすい言い替えがあるのがいい。
さらに、例が非常によいものが選んであって、自明な例、離散的な例から
連続的な例が自然に理解できるようになっており、概念の理解がスムーズにできるだろう。
金融工学の本は多数読んだが、ファイナンスの専門家にとっての良書はあったが、
初心者向けの本は、あまりいいものがなかったように思う。
下手な例え話をして、結果としてうそを書いている本や
ただ、dB = √dt だけ覚えておけばよい、のような安易な本もあった。
この本はそれらとは一線を画している。数学の立場から、最短コースで、
かつ省略することなく、初心者が数理ファイナンスを理解するのにきっと
役立つだろう。
posted at 02:42 |
category: /book/2002 |
固定リンク(『なっとくする数理ファイナンス』森真 著 講談社)
XMLとはどういうものかを知っていて、
Javaによるプログラミング経験がある人にとって有用な本。
1999年の本であるが、すでに古い内容も見受けられる。
しかし、具体的なXML文をどのように処理するかを実際のプログラムで
詳しく解説しているところは評価できる。
プログラムの本には2種類あって、
どのようにして行うかの手順を具体的に示す本と、
仕様を順に説明していく本がある。
英語で言うと前者がリーダー、後者がグラマーの
ようなものだろうか。この本は明らかに前者のタイプである。
前者のタイプの本は、節操がなく単にできればよいと言う考えで
書かれている本も多いが、この本はXMLとJavaの思想に忠実に、
方法論を展開している。
DOMのツリー操作、LMXの実装、Servletの例、JDBCとの連携など
話題も豊富で、読者は XML + Java の可能性の高さを認識するだろう。
今となっては開発環境などの話が少し古いのが難点だが、その点に注意すれば
おすすめ。
posted at 02:41 |
category: /book/2002 |
固定リンク(『XMLとJavaによるWebアプリケーション開発』丸山宏、田村健人、浦本直彦 著 ピアソン・エデュケーション)
著者の和田氏は著名な精神科医で受験テクニックの本なども書いているので、
書作を読んだことをある人も多いのではないだろうか。
この本の中で著者の言う「頭のいい人」はわざわざカッコ書きをしていることから
も分かるように、一般に使われている意味とは少し異なるかもしれない。
知識をたくさん持っていて計算が速いといった人を頭のいい人と思われているかも
しれない。もちろん豊富な知識も必要だが、知識を使って状況に応じた的確な推論が
できる人のことをここでは「頭のいい人」としている。
このような能力がなぜ必要とされているか、具体的にどのような能力なのかに
ついて、この本で詳しく解説している。精神医学の立場から、心理学的分析や
人格障害を例に挙げての説明は分かりやすい点も多い。しかし頭のいい人になる
ためのノウハウは抽象的で、いわば他の勉強法の本でも言われている一般的なこ
とに終止しているのは残念だ。もちろん、題名にも『しくみ』とあるように、
分析を主とした本であろうから当然と言えば当然かもしれない。
この本の中でいくつかの主張は、世間で一般にネガティブに考えられていることを、
その呪縛から解き放つと言う点で参考になる部分も多い。
例えば、トップにならなくても下の2割にならなければ生き伸びていくことができる
という主張や、要領がよいと言うことも社会が必要とする立派な能力であるという
主張などである。トップクラスにならないとダメだとか、コツコツ地道にやらない
とダメだとか思い込んで、自分の能力をうまく引き出せないでいる人にはこういう
考え方もあると言う広い視点にたてば、解決の糸口にできるかもしれない。
posted at 02:40 |
category: /book/2002 |
固定リンク(『「頭のいい人」のしくみ』和田秀樹 著 東京書籍)
剛体系のシミュレーションをしようと思っていろいろ文献を探していたときに
教えてもらった本。物理学演習 One Point シリーズの中の一冊だが、
単なる演習書ではなく、剛体系の運動方程式の説明から、人工衛星や
コマの運動などを詳しく説明してある。
もちろん演習書と言う形なので、例題や練習問題も多くのっているが、
この本の良いところは、理解する上でふさわしい問題を選んでいるところと、
それらの解答が非常に詳しいところである。最初は公式の説明を補足する、
または公式を当てはめる問題。次にその結果を用いて面白い現象例を例題形式で
紹介する、最後に大きなテーマに対して今まで紹介して来た手法でどのように
答えを導くかと言う問題。
理工系の大学生でも質点系の力学は勉強したけど、剛体の力学はあまり
やらないみたいである。私自身も、質点系の力学は詳しく勉強した記憶があるが、
学部の講義では剛体系は慣性モーメントぐらいで終わって、むしろ解析力学の
方向にすすんだ記憶がある。しかし剛体の力学は質点系の力学とは違う面白さが
ある。この本はその面白さを十二分に伝えてくれる。
一例を挙げよう。「竹トンボは軸の長さによって、うまく回転するときと、
回転しないときがある。うまく回転するための軸の長さの条件を求めよ。」
この問題もこの本に載っている。
posted at 02:40 |
category: /book/2002 |
固定リンク(『こまはなぜ倒れないか』安井久一 著 共立出版株式会社)
著者の森川氏はCG、ゲームなどのアーティスト、デザイナー。
いわゆる「文科系」の出身で、読者もそのような人を想定して書かれている。
扱っている内容は、遺伝的アルゴリズム、ニューラルネットワーク、
エキスパートシステムなど。専門書ではないが、「人工知能って何?」
と言う問いには最低限答えているし、数学が苦手な人でも読めると思う。
このような入門的な本では、以下にうまく「例え話」をするかで
理解のしやすさが大きく異なるように思われるが、この本は
(題名にあるように)マッチ箱やコンピュータゲームなどを例に
話を進めているのでとても分かりやすい。
もちろん理科系の視点で見ると、もっと一般化して議論した方が分かりやすいのに
とか、あまりにも初等的な例なので、読者が歪んで理解する可能性があるんじゃ
ないかとか、余計な心配もしてしまう。それを差し引いてもお話としては
よく書けている。
更に評価できる点は、きちんと人工知能の限界や問題点を紹介しているところ。
現在人工知能のブームは下火になったような感のあるが、何故そうなったのか
についての記述もあるのはよい。
レベル的には中高生向けだろうが、悲しいかな大学生でも理解できる人間の割合は
中高生で理解できる人間の割合と変わらないかもしれない。
この本では参考文献の代わりにいくつかのURLを紹介しているが、
面白いのが多いので、ここで引用させてもらおう。
posted at 02:39 |
category: /book/2002 |
固定リンク(『マッチ箱の脳』森川幸人 著 新紀元社)
確率の講義のネタ本になるかと思って読んだ本。
確率に関するところは最初の2章がおもで、
確率の本と言うよりも、数学を題材としたエッセイと思う方がよい。
数式はほとんど出て来ないが、むしろ論理的思考を強制される場面が多い。
世の中でよく誤解されていることに対して、パラドックスや、
反例などで読者を驚かせる。様々なエピソードを紹介している。
あまりにも話がいろいろな方向に展開しているので、ちょっとした頭の体操を
求めている人にはよいが、この本から何かを学んでやろうと言う人には不向き
かもしれない。
確率を勉強したあとに一読するときっと楽しめるだろう。
posted at 02:38 |
category: /book/2002 |
固定リンク(『確率で言えば』ジョン・A・パウロス 著 青土社)
インタビューをまとめたもの。聞き手は村上陽一郎。
長尾先生は私と同じ高校(膳所高校)の出身で、
私が大学院を出たときの大学の総長で、何かと縁がある
(もちろんむこうが私のことを知っているとは思えないが)。
人工知能の研究の黎明期の話から始まっている。
もちろん今のように高性能のコンピュータはないし、
記憶媒体も紙テープの時代だったが、
それでも新しいことを研究しているときの興奮や
チャレンジ精神が感じられる。長尾先生は
人のやらないことをやって、他の人がやるようになったら
分野を変えるという、常に新しいことに挑戦する人で、
機械翻訳から画像認識など様々なことのパイオニアである。
人工知能の研究は単なる技術だけではなく、文化的、哲学的な基盤も
影響しているということが話の節々から感じられる。
対談の中では、辞書を作るのに4年かかったとか、
認識率を100%にするのは非常に難しいなどという話がさらりと
出てくるところも興味深い。
対談だからすぐ読めるし、最後の方には科学技術全体に関する議論もあるので、
一度は読んでもらいたい。
posted at 02:36 |
category: /book/2001 |
固定リンク(『人工知能が人間を理解するとき』長尾 真 著 三田出版会)
セミナーのテキストを探しながらいくつかの本を読んでみたのだが、
この本は最新の内容に詳しいというわけではないが、人工知能の
考え方、応用例などをわかりやすく解説していて、入門書としてよい。
人工知能とは、人間の思考や認識をコンピュータにさせるための技術と
考えることができるが、それは人間の思考とは何か、認識とは何かという
哲学的な問いにつながっていく。この本は、そういう意味で人工知能を通して、
人間の知的行動をもう一度問いなおすという方向で書かれている。
人工知能の応用の身近な例では日本語漢字変換における学習機能で段々と変換効率が
よくなっていくことや、チェスや将棋などでコンピュータが相手をしてくれる
対戦ソフトなどがある。それらのプログラムを作るにあたっては、
人間がどのように漢字を使っているか、または将棋のある場面でどのように
状況判断しているかなどをコンピュータに教えなくてはならない。
この本では、コンピュータにそのようなことを教えるにはどうすべきなのかを、
文字認識、画像認識、機械翻訳などを例に様々な側面から解説している。
と言ってもコンピュータの解説と言うよりも、むしろ数学基礎論、論理学、言語学、
哲学的な側面から解説しているので、プログラムやコンピュータを知らない
人でも十分に理解できる。
posted at 02:35 |
category: /book/2001 |
固定リンク(『人工知能と人間』長尾 真 著 岩波新書)
歴史上の暗号のエピソードから最新の暗号理論まで。
話題は幅広いが、ドラマチックで一気に読ませる。
単アルファベット換字式暗号では読者といっしょに暗号を
解く過程を再現し、ビール暗号では実際にその暗号
を載せて読者の好奇心を刺戟する。エニグマの解読の
エピソードは下手な小説よりもずっと面白く、
エニグマのメカの解説などを間にはさんで、読者にその昔
科学ものや推理小説に夢中だった少年時代を思い出させてくれる。
そこまででも充分に面白いのだが、この本の真髄はやはり
最後の三章だろう。いわゆる公開鍵暗号方式ができるまでの軌跡と
PGPに関する一種の闘い、そして量子コンピュータについて。
ここでは数学者が大活躍する。数学者は抽象的で役に立たないことばかり
しているわけではないのだ。
素因数分解の一方向性を利用して公開鍵を作ると言うのは今やよく
知られた話だと思うが、RSAと同等のものがそれより前にイギリスで
作られていたと言う話はあまり知られていないのではないだろうか。
私自身、小耳にはさんだ程度しか知らなかったが、
この本ではその辺のエピソードまで紹介している。
最初のメアリーと
エリザベスとの話や、エニグマ解読のチューリングの話と共に、
イギリスと言う国のお国柄が出ているようで興味深い。
posted at 02:35 |
category: /book/2001 |
固定リンク(『暗号解読』サイモン・シン 著 新潮社)
普通のオペレーションズリサーチの教科書で待ち行列を扱うときには、
そのモデルを確率過程と見なして各種の計算をすると言う形が多い。
実際私が講義として担当するときもそのような形で行ってきた。
しかしこの本は豊富な具体例から待ち行列や交通渋滞(交通工学)などの話を
展開しており、いろいろな面で示唆に富んでいる。
抽象化またはモデル化をしてしまうと、そのことによって問題の見通しがよくなって、
いろいろな量の計算ができるようになるのであるが、いかんせん抽象化の際に
切り捨ててしまうものがあるのは否めない。
その切り捨てたものの中にじつは面白いものが多数含まれていたりするのである。
特にバスがダンゴ運転してしまう現象、横断舗道における歩行者のすれ違いの現象
などは非常に興味深い。恥ずかしながら
私はこれらの説明をこの本ではじめて知った。
スタンダードなオペレーションズリサーチの勉強を一通りした人にお勧め。
posted at 02:34 |
category: /book/2001 |
固定リンク(『混雑と待ち』高橋幸雄、森村英典 著 朝倉書店)
法律を舞台にした小説と言うと、法廷ものでの被告側と原告側との戦いであるとか、
弁護士を主人公とした勧善懲悪ものが多かったと思うが、この小説はこれらのような
民法や刑法を扱うものではなく、商法を扱うものとして珍しい部類に入るだろう。
株式の公開買付で会社を買収して、その会社の社長に対して主人公が復讐しようと
いうのがおおまかなストーリーである。その中では、株主代表訴訟、第三者割当
などを駆使して戦いを挑んでいる。私を含めて、商法や会社の経営に馴染のない人間
にとっては遠い世界の出来事のようであるが、いつのまにか引きこまれて行く。
法律と言うのは、正義が勝つようにするための社会のしくみとも言えるが、
商法に関しては、企業の間のゲームに関するルールであるという感想を持った。
そのルールに従って、色々な手段を駆使し、いかにして敵に勝つか。
その生き生きとした描写がこの小説を面白くしてるのだろう。
著者は検事経験のある国際弁護士。たぶん法律に関する記述は信用しても
よいだろう。商法を勉強した人には、実際の経営や企業買収の話が出てくる
小説として、十分に楽しめると思う。小説と言っても、事実は小説より奇なり、
であるからそのうちニュースでこの小説の内容よりももっと凄い話が報道
されるかもしれないが。
posted at 02:33 |
category: /book/2001 |
固定リンク(『買収者(アグワイアラー)』牛島信 著 幻冬社)
金融相場にデリバティブが登場するとともに、物理学者や数学者が
金融市場に参入をはじめた。そのなかの複雑系とよばれる分野の研究者が
市場の予測をもくろんで、プログラムを開発していく様子のドキュメント。
ドキュメントであるがそれを忘れてSF小説を読んでいるような面白さがある。
本文中に金融工学の基礎的な話(オプション、リスクヘッジ、効率的市場、
ランダムウォーク)があらわれ、読んでいるうちにその意味がだんだん実感を
持ってわかるようになるだろう。効率的市場仮説によれば、市場を出し抜くことは
できないとされている。裁定機会が生じればすぐに消えてなくなるはずと言うのが、
効率的市場の説明である。しかし裁定機会を消し去る者はいるはずであり、
実際のトレーダーたちも必ずしも効率的市場仮説を信じているわけではない。
しかしながら市場を出し抜くにはどうすればよいかわからない。
主人公達は出し抜くような(裁定機会を探すような)プログラムを
開発しようとして金融市場に挑戦していく。へたな小説よりもよっぽど
スリリングである。
また、経営にはほぼ無援の研究者たちが、
資金を調達し事業をおこして、発展させていく様子も面白い。
銀行や証券会社の担当者とやりあったり、部下と論争したりする場面は
なまなましくて迫力がある。金融市場におけるドキュメントとともに、
会社を興して発展させていくベンチャーの物語としても十分楽しめるだろう。
posted at 02:33 |
category: /book/2001 |
固定リンク(『マネーゲームの予言者たち』トマス・バス 著 徳間書店)
おなじみ野口先生の本。新書版の
『金融工学、こんなに面白い』
の内容を詳しくしたような本。新書版を読んだときにこちらの一部にも目を
通していたのだが、全部読む時間がなくて、やっとこのお盆休みに読めた。
私自身金融工学の専門じゃなく、「はじめに」に書いてある「他分野の専門家でこの分野への転換を考えている方々」なので、内容が標準的がどうかは分からないが、
主にポートフォリオとオプションについての基本的な話から最新の話まで
広く紹介してある。と言っても単なるお話しではなく、本格的な理論を基礎から
噛み砕くように説明してある。特に第4章の資産価格モデルと第11章の
オプション価格理論Iは難しいところをうまく説明してある。必読であろう。
数式も登場するが、遠慮して書いているのか、ちょっとまどろっこしい説明に
なっているところが多い。まあ経済学部の学部生向けなら仕方のないところか。
もっと数式ばりばりの記述を期待したのだが。中途半端に数式を出すより、
全部手のうちを見せて欲しかった。
これはスタイルの違いだからどうしようもないけど。
例えばオプションの価格の決定にリスク中立確率を用いなければ
ならないことを強調しているのはいいが、その理由の説明はちょっと分かり
にくいような気がしたのだが。グラフが多いのは好感が持てる。
野口先生は『超勉強法』などでも有名。これで分かりにくい教科書を
書いていたら洒落にならないが、さすがに良くまとまっていて、通読にも
後から定義や公式を確認するにも使いやすい。
ただ数式や理論の説明はあっさりと書いてあって、よくよく考えるとちょっと変な
(というか悩んだ末に、別の解釈にたどり着く)ところも
(第7章の「市場は効率的か?」など)あるので注意。まあ、どんなテキストでも
そういうところがあるのが普通だから別にこの本が悪いわけではない。
私の読みが甘いだけに過ぎないのかもしれないし。
レベルとしては学部後期から大学院初年級ぐらいかな?
posted at 02:32 |
category: /book/2001 |
固定リンク(『金融工学』野口悠紀雄、藤井眞理子 著 ダイヤモンド社)
実は以前に読んでいたのだが、この度再読したので
もう少し詳しい書評を書くことにした。読み直すと以前は理解できずに
いたところも、理解できたりして新たな発見が多かった。
専門書で読むたび毎に新たな発見がある本というのはそれほど多くない。
確率過程の話をファイナンスへの応用を中心にしながら展開している本。
大学院の講義のテキストを元に書かれただけあって、
必要なことをコンパクトにまとめてある。
特にBlack-Scholesの公式を確率微分方程式のところで登場させるのではなく、
2項モデルの極限として中心極限定理を使って導いているのは、
初学者にも入りやすいし、上級者にも別の視点を与える意味で
面白い。
また、裁定機会がないことからいわゆる測度変換をしてリスク中立確率を
求めるところも、2項モデルなどの(離散的な)確率過程で十分議論してから
連続的な確率過程や確率微分方程式への議論へ発展させているところが
教育的で、読む方にも分かりやすい。
数学的に高度な証明は省略しているが、内容は豊富で、問、付録とも充実している。
例としてノックアウトオプションやルックバックオプションなども紹介してある。
学習者にも研究者にもお勧め。ただし学部生にはちょっと難しいかも知れない。
確率過程のことを中心に議論してあるので、数値計算をしたい人にも十分参考に
なると思われる。
posted at 02:31 |
category: /book/2001 |
固定リンク(『ファイナンスのための確率過程』森村英典、木島正明 著 日科技連)
いわゆるパーコレーションについて学部初年度の学生にもわかりやすく
説明している。パーコレーションとはもともとは「浸透」の英訳であるが、
この本の題名にもあるように「つながり」具合を見るものである。
本にはビンゴゲーム、水道管、うわさの伝達などの例が取り上げられている。
例えば水道管の例なら、碁盤状に水道管が張りめぐらせられているとき、
途中どれだけの割合で水が流れればある地点から別の地点にまで水が流れるか、
などの問題を扱うのがパーコレーションである。理論上の研究も進んではいるが、
まだ完全な解は求まっていない問題も多く、面白い分野である。
この本は抽象例と具体例のバランスもよく、数値も初等的な入門書としては
必要にして十分な量だと思われる。専門家ならではの広い視野で
多数の応用例を紹介しているのはうれしい。銀河の渦状星雲にも
パーコレーションが関係していることはこの本ではじめて知った。
ネットワークの強さや火災が燃え広がらないための国土計画の話まで
関係してくる。
薄いブックレットだが、これでパーコレーションに興味を持ってくれる人が
増えれば嬉しい。よければ一緒に勉強しませんか?
posted at 02:31 |
category: /book/2001 |
固定リンク(『つながりの科学』小田垣孝 著裳華房)
数学者のはしくれとしては、フェルマーの最終定理と言うのは特別な存在である。
誰でも一度は(無邪気にも)挑戦しようと思っただろうし、単純そうに見える
この問題を解こうとして多くの新しい概念が生まれ、いろいろな分野と関わりを
持つことに驚きと感銘を覚えたはずである。
長い間未解決だったこの問題は20世紀末にワイルズ氏によって証明が与えられた。
この本はフェルマーの最終定理に関わる歴史的な流れと、それに挑戦した
数学者達のドキュメントである。
数学の説明は中途半端で、これを読んでイデアルや楕円曲線が何を意味するかは
わからないと思うし、途中に出てくる数学の説明も前後とどのように関連してい
るのかもはっきりしない。
しかし、これは数学の啓蒙書ではなく歴史書?と思えばいいのだろう。
ギリシャ時代の話から、フェルマーの問題の起源、クンマー、ガロア、デデキント
などによる発展など普通の数学史の話としても面白い
(数論にかたよっているきらいはあるが)。
著者と(当然われわれとも)同時代の数学者に関する記述は生き生きとしていて、
読みながらもわくわくしてしまう。日本人にとって嬉しいのはこの問題に対する
谷山、志村両氏(「氏」というよりも「大先生」なのだが)の貢献について
きちんと書かれていることである。そのおかげ(?)で、
ヴェイユが悪者みたいに書かれてしまっているけど。
エピソードが中心だけど、数学に興味のある人以外もこれで
数学者の活動がどういうものかを知ってもらえると嬉しい。
もちろんここに登場する数学者は「超」一流で、普通の
数学の先生とはちがうんだけどね。
posted at 02:30 |
category: /book/2001 |
固定リンク(『天才数学者たちが挑んだ最大の難問』アミール・D・アクゼル 著早川書房)
題名から判断すると、国債のしくみを説明した教科書的な本と思うかも知れないが、
日本国債をテーマにした経済小説である。
経済学の授業で国債がどのようなものなのかは勉強していても、
実際にどのように発行されるのか、取引されるのかは実感がわきにくい。
この本の著者は国債のトレーダーの経験もあり、取引の描写は
リアルで生き生きとしている。どのようなシステムで取引が行われているのか、
トレーダーと呼ばれる人は一体何をする人なのか、取引中のマーケットの動きなど
、経験者ならではの詳細な記述は、読むものにその現場にいるかのような
興奮を味わわせてくれる。
小説と言う形式を借り、ある経済犯罪のなぞ解きのようなストーリー展開を
しながら、現在の国債の持つ問題点をうきぼりにしている。おそらく著者が
トレーダー時代に空想していたことをもとにしているのだと思われるが、
ここまでふくらませて壮大なストーリーにする才能にはただ感服する。
どのような話なのかを書くとネタばれになるので詳しくは述べないが、
経済小説を毛嫌いしている人にこそ読んで欲しい。特に経済の専門家の人は
経済小説をばかにしているきらいがあるが、一度読んで感想を聞かせてほしい。
posted at 02:29 |
category: /book/2001 |
固定リンク(『日本国債(上、下)』幸田真音 著講談社)
第I部と第II部は証券市場の一般論といわゆるテクニカル分析の話。
テクニカル分析は限界があると言う結論から数学者(経済学者も?)は、
どうせわからないなら乱数だと考えて、ランダムウォークで証券市場を
モデル化しようとする。さてこの本ではどう続くのか...
ページをめくると第III部にいきなりフロイトだのユングだの心理学の話だ。
私も大学のとき心理学の授業をとったり本を読んだりしたので、
心理学がどういう学問かぐらいはわかっているつもりだ。
しかしどうやって株の話とつながるのだろう??
と言う疑問を感じながら読んでいたが、その疑問は読み進めるうちに氷解する。
市場参加者がどのような心理で取引をするのか、またチャートからそれを
どのように読み取ることができるか。これらのことを多くの例を紹介しながら
説明しているのだ。信じるかどうかは別にして、面白いことは事実だ。引きずり
込まれるようにして読み進んでいった。結局のところ相場で勝つには、
冷静に客観的に判断しないといけない、と言うだけなのかもしれないが。
posted at 02:28 |
category: /book/2001 |
固定リンク(『相場の心理学』ラース・トゥヴェーデ 著ダイヤモンド社)
私が高校生の頃、著者の『桃尻語訳枕草子』を読んだことがあるが、
その裏話を知りたいと言う動機もあって読むことにした。
題名からして人を食ったような感じだが、人々が気づかないでいること、もしく
はすぐに忘れてしまうこと、つまり「わからない」という状態から「わかる」
と言う状態に変化する過程の方法論を述べたものである。普通の人(作家)は
自分がわからない状態いるということなど隠してしまうものだが、この著者の
橋本治氏のすごいところは、そんなところも全てさらけ出してしまっているとこ
ろだろう。すごい泥臭いやり方で『桃尻語訳枕草子』を書いていたんだというこ
とがわかった。
学生諸君と話していると、わからないでいることに開きなおって、知識を丸飲み
しようとばかりしているように思われる。短期的にパッと覚えて、試験のときに
パッと吐きだして、後はすっかり忘れてしまう。だから丸飲みしやすいような教
科や授業が人気があるのだろう。
勉強していて一番面白いのは「全部覚えた!」という達成感ではなく、
わからない状態が段々変化してわかるという状態になるその過程である。
それを一度体験すると、面白くて、興奮し、また次を求めてしまう麻薬的なもの
ですらある。その手法として著者のいう「わからない」という方法が
あるのではないかと思う。一度この手法を身につけてしまうと、新しく学ばなけれ
ばならないことがあっても、「わかる」ようになるのである。
研究者や作家はその興奮を求めることを職業としてしまった人である。
短期記憶に頼るような勉強はやめて、学生時代に一度は著者のいう「天をいく方
法」や「地を這う方法」を体験してほしい気がする。
posted at 02:27 |
category: /book/2001 |
固定リンク(『「わからない」という方法』橋本 治 著(集英社新書 0085C))
著者のリーナスは Linux の開発者。彼がどうしてこの Unix ライクな(いや、
「ライクな」は外すべきかも知れない)OSを開発するにいたったのか、またそれ
をめぐる騒動を彼自身の言葉で書き表している。久しぶりに夜を徹して時間を忘
れて読んだ本。とにかく面白い。UNIX の技術的な話、オープンソースの思想、
産業界に注目されるようになってからの Linux の立場などトピックも多く飽き
させない。
しかし何よりもこの本を面白くしているのは、リーナス本人の人柄であろう。
少年時代の回想部分や、彼をビルゲイツと対比して論じたい人々に対する皮肉な
ど、思わずにやりとしてしまう。
楽しいことは、別にお金もうけにならなくたって夢中になるし、
わくわくするし、興奮するものなのだ。そういうものは程度の差こそあれ誰にでも
あるのだろうが、それが Linux と言う、今全世界のコンピュータおたく
たちを夢中にさせているものである彼は最高に幸せものであろう。
posted at 02:26 |
category: /book/2001 |
固定リンク(「それがぼくには楽しかったから」リーナス・トーバルズ+ディビッド・ダイヤモンド 著 (小学館プロダクション))
同じ著者のダイヤモンド社から出ている「金融工学」のダイジェスト版のような
感じ。エピソードよりも理論中心なので、私のような立場ではわかりやすい。
特によい点は、第6章のオプションの説明のところで、オプションの価格を計算
するために測度変換が必要なことを強調している点と、ブラック=ショールズ理
論を使わずに初等的な計算だけでオプション価格を計算する方法を紹介している
点である。オプションの価格を求めるには(測度変換せずに)現実の株価の確率分
布を使って期待値を求めればよい、などと言う誤った記述
をしている本が多い中、新書判なのにもかかわらずここまで正確に書いている本
を他に知らない。
初等的計算でオプション価格を求める方法は、はずかしながらこの本ではじめて教わっ
た。
ブラック=ショールズを勉強する前にぜひとも読んでおくべき本。
posted at 02:26 |
category: /book/2001 |
固定リンク(「金融工学、こんなに面白い」野口悠紀雄 著 (文藝春秋))
確率過程をコンピュータ上で生成するために、著者の言う『有限確率解析』
について解説した本。最近は金融工学の関係で、この手の本も多く、実際類書を
手に取ることも多いが、この本の特色は応用を金融工学に限らず、自然科学や工
学における応用を紹介している点だろう。逆に経済の応用は少し触れているだけ
なので、別の本で補うことが必要。しかし他の本は理論的なことばかりなので、
コンピュータ上で計算するときにはこの本に戻るとよい。個人的には量子物理学
における応用は面白いと感じた。最初の1章はいらないのでは?と言う気もする。
むしろ最後に本の中でとりあげた例を表計算ソフトで計算する方法をとりあげて
くれれば面白いのでは?(それだけで別の本になってしまうか??)
posted at 02:25 |
category: /book/2001 |
固定リンク(「数値確率解析入門」保江邦夫 著 (朝倉書店))
writeback を入れてみました。
2006年2月現在、無効にしてあります。
posted at 02:23 |
category: /About |
固定リンク(Blosxom に writeback をいれる)
Sat, 11 Feb 2006
ライフゲーム(Java Web Start)
ライフゲームとは?
コンウェイ氏が考案した2次元セルオートマトンの一種である。
ゲームという名が付いているが、コンピュータと対戦するような
ゲームではない。
ライフゲームのルール
- 平面を正方形のセルで分割する。
- それぞれのセルは生(白い色で表現)と死(黒い色で表現)の2種類の状態を持つ。
- 次世代においてそのセルの生死は次のルールで決まる。
- 現在が生の状態のとき、周りの8個のセルのうち2個もしくは3個のセルが生
の場合、次世代もそのセルは生、他の場合は死。
- 現在が死の状態のとき、周りの8個のセルのうち、3個のセルが生の場合、
次の世代のセルは生、その他の場合は死。
これによれば現在生の場合でも、周りに4個以上生のセルがあれば、
そのセルは死んでしまう。つまり、生のセルが多すぎたら生き残れ
ないということである。逆に少なすぎてもだめなことがこの条件を
見ればわかるであろう。
プログラムの説明
このプログラムでは RANDOM ボタンを押すと
初期状態を乱数により 1/2 の確率でそれぞれのセルに
生と死を割り当てている。セルの大きさは縦横5ピクセルの正方形にしている。
上下の辺と、左右の辺はそれぞれつながっていると考えている。
幾何学的にはこれは2次元のトーラス上のライフゲームと考えてよい。
シミュレーション停止時にはマウスの左クリックと右クリックでマウスカーソ
ルのある位置のセルの生死の状態を変えることができる。
posted at 02:08 |
category: /Program |
固定リンク(ライフゲーム
)
Ising 模型シミュレーション(Java Web Start)
履歴
- 2003/10/12
- インターフェイス改良。画像復元シミュレーションが可能に。
- 2003/10/05
- 久しぶりにソースの見直し。パフォーマンスとデータ構造のチェック。
シミュレーション結果
100x100サイズの格子について、温度(エネルギー)を変化させながら、
100x100x1000回メトロポリス法に従いランダムに格子の状態を変化させた結果の
Hamiltonianを計算する。そのシミュレーションをそれぞれの温度のときに
100回繰り返したときの平均をグラフにすると下のようになる。
これによると、温度が2.5ぐらいの時に相転移が起こっていることが観察できる。
posted at 01:45 |
category: /Program/Physics |
固定リンク(イジング模型
)
Spin Glass シミュレーション(Java Web Start)
Ising 模型における相互作用を表すパラメータは定数(強磁性モデル)だったが、
相互作用パラメータにヘップ則によるパターンを与えることで、
連想記憶をさせることができる。ここでは◯と×をシミュレーションすることにする。
履歴
- 2003/11/16
- Ising 模型のシミュレーションを改良して作成。
スピングラスとは
岩波講座物理の世界
「スピングラスと連想記憶」[1]
にコンパクトにまとまっている。+1 と -1 の二つの状態(スピンと言う)をとるセルと、
セルの間の相互作用を表すパラメータで系の状態を記述する。
強磁性体の場合は、相互作用を表すパラメータは空間的に一定で
その場合セルのスピンはそろう方が系は安定する。
一方スピングラスの場合は相互作用を表すパラメータは空間に対して一定でなく
その結果安定な状態が複数現れる。
ここでは◯と×のパターンを記憶するような相互作用を表すパラメータを
ヘップ則([1]33ページ)にしたがって与え、
ホップフィールド模型をシミュレーションしている。
「温度」によって系のゆらぎをメトロポリス法で与え、ハミルトニアンの値が
小さくなるように系の状態が変化していく。
ランダムに見えるパターンが〇か×のどちらかに収束していく。
どちらになるかは初期状態がどちらに近いかでほぼ決まる。
今後の予定
〇と×のパターンでハミルトニアンが極小値をとると考えられるが、
〇から×へパターンが変化する、すなわち峠を越えるにはどれくらいの温度が必要か、
また〇と×のそれぞれのパターンに収束する確率を計算する。
(確率を計算する方法はあるのだろうか?)
もちろん三次元のパターン記憶のシミュレーションも。
(ホップフィールド模型は相互作用を全てのセルに対して行うので次元に依らずにできるはず。)
posted at 01:32 |
category: /Program/Physics |
固定リンク(スピングラス
)
Fri, 10 Feb 2006
Pell 方程式の最小解を求めるプログラム(Java Web Start)
x2 - N y2 = ±1
を満たす最小の整数解 (x,y) を求める。
posted at 03:00 |
category: /Program/Math |
固定リンク(Pell 方程式を解く
)
Black Scholes の公式(Java Web Start)
ヨーロッパ型コールオプションの価格をブラック・ショールズの
公式を使って計算するプログラム。ブラック・ショールズの公式とは、
現在の価格が Y の証券を満期期間 T 後に行使価格 K で売るオプションの
現在での合理的価格 C(Y) を求める公式である。ただし、非危険利子率を r 、
ボラティリティを σ とする。
C(Y) = YΦ(g)-Ke-rTΦ(h)
g = ((ln(Y/K) + (r + σ2/2) T) / σ T1/2
h = g - σ T1/2
Φは標準正規分布の累積分布関数で、数値計算には不完全Γ関数を用いる方法を使っ
た。
参考文献
- 「ファイナンスのための確率微分方程式」
トーマス・ミコシュ 著 (東京電機大学出版局)
- 「C言語による最新アルゴリズム辞典」
奥村晴彦 著 (技術評論社)
ブラック=ショールズの公式については[1]が詳しい。
[2]は標準正規分布の分布関数の計算に用いた。
posted at 02:47 |
category: /Program/Math |
固定リンク(ブラックショールズの公式
)
Thu, 09 Feb 2006
産総研が
空中に浮かび上がる3次元(3D)映像
というプレスリリース出してました。
視差を利用するのではなく、空間に直接描画するというのはある意味正しい方向。
それができなかったから視差でごまかしていたわけで。
解像度が高くなれば面白そう。
posted at 08:49 |
category: /VR/News |
固定リンク(プラズマの発光で3D
)
Wed, 08 Feb 2006
決定木の木構造を決めるための指標として Gini index というのがあり、
同じ名前または Gini Coefficient として経済学の所得分布の話ででてくる
指標がある。時々混乱してしまうので、調べてみたのでまとめておこう。
|
決定木に出てくるGiniIndex |
所得分布に出てくるGini係数 |
| 対象 |
離散分布 |
連続分布 |
| 定義 |
1-Σpi2 |
ローレンツ曲線と45度線で囲まれる部分の相対面積 |
| 別の定義(変形) |
Σpipj(i≠j) |
Σ|xi-xj|/2n2μ |
x
i達が離散値を取るとして、Gini係数の方の定義で、
異なるx
iとx
jをfixしたとき、そのiとjについて
1/2n
2を足し合わせたものを、fixした値の出る確率の積
p
ip
j と考える(iとjを交換するので2がつく)。
すると、
|x
i-x
j|/μ = 1
として離散分布の空間に距離を入れたと考えれば、両者は一致する。
参考:
posted at 01:52 |
category: /Math/InfoGeom |
固定リンク(Gini index
)
Wed, 11 Jan 2006
結び目を円周から3次元空間への写像とみなし、
それを三角関数で展開したときの係数を与えて結び目を描く。
有名な結び目については、あらかじめ与えている。
まずはメニューから有名どころの結び目を選んでみてください。
それから係数を変化させてお楽しみください。
他の結び目の係数を御存じの方はぜひお知らせください。
履歴
- 2003/6/15
- いつ作ったかよく覚えていないのだけれど、2003年になってからなのは
確か。Swing でスライダーを作って係数を変更するようにしている。
法線ベクトルを GeometryInfo を使わずに自力で計算するようにしたが、
しわになっていしまうこともある。他に依存しないような法線ベクトル
の作り方を考え中。
posted at 22:32 |
category: /Program/Knot |
固定リンク(結び目
)
3次元の常微分方程式の中で視覚化することに意義があるものとして
取り上げた。たぶん一番最初に作ったまともな Java3D の
プログラムだったような・・・・・。
方程式
x' = -10x + 10y
y' = 28x -y -xz
z' = xy - 8/3z
を初期値 (x,y,z) = (0,5,0) の下で数値計算する。
posted at 21:31 |
category: /Program/Physics |
固定リンク(ローレンツアトラクタ
)
力学の教科書の内容は質点系の力学と剛体の力学の二つに大きく分けられている。
質点系の力学を Java3D で行うことための処方箋はほぼ分かってきて、
むしろネタ切れの感があったので、剛体の力学に挑戦することにした。
使い方
内部角運動量、慣性テンソル、軌道を表示する場合の局所座標の点、外部重力ベクトル
を与えて、シミュレーションをする。剛体の運動方程式に従って数値計算を行う。
剛体は独楽のような形をしているが、便宜上であって、独楽の慣性モーメントを
持つわけではない。次のような特徴的な初期値を与えることができる。
- Unstable
- 主慣性モーメント(つまり慣性作用素が対角行列のときの対角成分)が全て
異なるときに、中間の大きさの主慣性軸は安定ではない。そこで、
その方向の角運動量を大きくとって、それ以外の角運動量をわずかな値にして
シミュレーションをすると興味深い運動が見られる。
- Lagrange
- いわゆるラグランジュのコマ。回転の軸に対して、主慣性モーメントが対称。
- Kowalevski
- いわゆるコワレスカヤのコマ。回転軸は剛体の主軸と一致するが、
主慣性モーメントは回転軸と、それに垂直な一成分が等しく、
残りの一成分はそれらの2倍。
剛体の運動を空間上の回転を表すリー群上の運動だと思い、
角運動量はそのリー環(本当はその双対空間とすべきだけど、計量によって
同一視しておく)に値を持つと考える。
慣性テンソルをリー環上の対称作用素と考えて、
リー環の変数 M についての微分方程式
dM
-- = [M,Ω]
dt
M = A(Ω)
を解いて、角運動量 M を求める。
その角運動量にしたがって
りー群上の運動を求め、それに従って剛体の座標系を回転させている。
ちなみにこれは外力のない場合、つまりは
無重力空間内での剛体の運動となっている。
剛体がある重力場の中にいるときには、次の方程式になる。
dM
-- = [M,Ω] + [G,L]
dt
M = A(Ω)
ここで、G は剛体の座標系による
重力ベクトル場で、L は固定点を原点とした時の重心の位置ベクトルである。
はじめ Arnold の「古典力学における数学的方法」を見たが、剛体の運動は
のっていても、Hamilton 力学ではない。そこで、Abraham and Marsden の
Foundations of Mechanics とか、Marsden and Ratiu の Introduction to
Mechanics and Symmetry などを参考にした。この方程式の導出自体は
Hamilton 力学でなくてもできる。
数値計算は局所座標に書き下さずに行列のまま
vecmath パッケージを用いて計算した。ルンゲクッタ法は
行列環上の演算に翻訳して用いている。翻訳があっているかについて
理論的にチェックしていないので、ひょっとしたら積の非可換性から
ルンゲクッタ法で保証される以上の誤差が出てきてしまうかもしれない。
履歴
- 2002/3/9
- 取りあえず重力場対応にして、重心の位置と重力場を入力可能にする。
パラメータの指定方法はあまりよい方法ではないかもしれない。
- 2002/3/6
- 軌跡を描画するための軸の方向を変更可能にする。
軌跡を書くためのクラス Tail を Shape3D から BranchGroup に変更。
さらにデータ処理方法も参照モードに変更。たぶんコピーモード
よりも速い。さらに頂点の色も指定するようにして、色が減衰してい
くようにした。オマケとして Rainbow モードで作成。
- 2002/3/4
- 軸の軌跡を描画する。
- 2002/3/3
- 数値計算をルンゲクッタ法に変える。発散はおさまる。
- 2002/2/26
- オイラー法で数値計算する。すぐ発散してしまう。
- 2002/2/23
- 開発開始。
posted at 21:19 |
category: /Program/Physics |
固定リンク(剛体の運動シミュレータ
)
ルービックキューブのシミュレーションプログラムの4x4バージョンです。
Java3D で作っています。
画面下のボタンを押すか、色名のキーを押すと、
デフォルトの状態でその色が中心にある面をその面の上から見て
時計回りに90度回転します。
4x4なので、中心の色もそのうち変わってしまうので注意。
posted at 00:39 |
category: /Program |
固定リンク(4x4ルービックキューブ
)
三体問題は、ハミルトン系の例として教科書によく現れ、また初等的に解けない例としても
よく紹介される。そこで Java3D でハミルトン系を扱う場合の例として取り上げることにしました。
数値計算はシンプレクティック法を Java で実装したものを使っています。
開発履歴:はじめ2000年の秋頃に作ったのですが、そのときの履歴をなくしてしまいました。
- 2003/8/2
- うまく動かなくなっていたのを直す。アプレットにおけるパラメータ表示のための
スレッドの処理などを変更。
- 2000/秋頃
- 開発開始。数値計算に使うためにシンプレクティック法をパッケージ化する。
posted at 00:25 |
category: /Program/Physics |
固定リンク(三体問題のシミュレータ
)
Tue, 10 Jan 2006
古いコンテンツなどを整理しています。すべてを blosxom のコンテンツとして統合しようと思っています。そのため日付が変わっていたり、古いコンテンツが新しい日付で登録されていたり、と見にくくなってしまっていますが、ご容赦くださいませ。
posted at 23:56 |
category: /About |
固定リンク(ただいま整理中
)
Mon, 09 Jan 2006
以前作ったルービックキューブのシミュレーションプログラムを
Java Web Start で起動できるようにしてみました。ただし、セキュリティ証明書は
証明書発行期間から取得したわけではない、いわゆるオレオレ証明書。
しかも6ヶ月で期限切れになる。対策はそのうち考えます。
画面下のボタンを押すか、色名のキーを押すと、
その色が中心にある面をその面の上から見て
時計回りに90度回転します。
posted at 23:23 |
category: /Program |
固定リンク(ルービックキューブ
)
Canvas の内容をそのまま保存することはできない。
BufferedImage に書き込んで、Canvas には drawImage() で書き込むことにしておく。
その状態で、image を BufferedImage のインスタンスとして、
FileOutputStream output = new FileOutputStream("test.jpg");
JPEGImageEncoder jpeg = JPEGCodec.createJPEGEncoder(output);
jpeg.encode(image);
output.flush();
output.close();
とすればよい。ただし、IOException を throw するので例外処理が必要。
サンプルソース
参照。
posted at 19:38 |
category: /Java/tips |
固定リンク(Canvas の内容を jpeg ファイルに保存するには
)
Canvas に図形を描画するときに、直接 Graphics に書き込むのではなく、
バッファーとして Image オブジェクトを作成し、その Graphics に書き込んでから
drawImage メソッドで Canvas の Graphics に書き込む。
具体的には、Canvas のフィールド変数として、
Image image; // イメージの保存
Graphics g0; // image に描画するための Graohics
を追加し、paint() メソッドは
public void paint(Graphics g){
// image が初期化されていたいときは初期化する
if(image == null){
image = createImage(getSize().width,
getSize().height);
// Graphics の取得
g0 = image.getGraphics();
}
// image を表示する
g.drawImage(image,0,0,this);
}
とし、実際の描画は
g0.fillRect(20,20,50,50);
getGraphics().drawImage(image,0,0,this);
のように g0 に書き込んでから drawImage で Canvas に書き込めばよい。
posted at 19:36 |
category: /Java/tips |
固定リンク(ダブルバッファリング
)
アプレットを作るときに、わざわざhtmlファイルを書いてブラウザで
動作を確認するのは面倒である。(appletviewer をつけばちょっと楽だが)
そんなときはアプレットとして作ったプログラムをアプリケーションとして実行
させよう。
次のアプレットはボタンを押せばメッセージが出ると言う定番のアプレットだが、
これをアプリケーションとして動くようにするために、main メソッドを付け足
している。そこでは、Frame を生成し、Applet を張り付けているだけである。
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class HelloAppletcation extends Applet{
Button bt;
TextField tf;
public static void main(String args[]){
Frame fr = new Frame("Hello Applet");
fr.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
Applet app = new HelloAppletcation();
app.init();
fr.add(app);
fr.setSize(400,100);
fr.setVisible(true);
app.start();
}
public void init(){
bt = new Button("PUSH");
tf = new TextField(30);
add(bt);
add(tf);
bt.addActionListener(new HelloButton());
}
class HelloButton implements ActionListener{
public void actionPerformed(ActionEvent e){
tf.setText("Hello, Java World!!");
}
}
}
動的に Applet として実行しているか Application として実行しているかを
判定したい場合は、Applet クラスの getCodeBase() メソッドを呼ぶとよい。
Application の場合は例外が発生する。
posted at 19:35 |
category: /Java/tips |
固定リンク(アプレットとアプリケーションの兼用プログラム
)
実行時にクラスを呼ぶ例を挙げよう。
まず A(String str,double x) と言うコンストラクタを持つようなクラス A
を考えよう。このクラス A を動的に呼んでインスタンス化するには次のようにする。
ここで、ClassLoader クラスは抽象クラスなので、それを継承したクラスを
ClassLoadTest とする。
ClassLoader loader = new ClassLoadTest();
Class c = loader.loadClass("A");
Constructor con = c.getDeclaredConstructor(
new Class[]{String.class,double.class});
A a = (A)con.newInstance(new Object[]{"circle",new Double(3.14)});
例外処理に付いては省略した。
posted at 19:33 |
category: /Java/tips |
固定リンク(クラスの動的読み込み
)
外のクラス名.this でアクセスできる。
class InnerOuter{
String str = "Outer";
A a;
InnerOuter(){
a = new A();
}
class A{
String str = "Inner";
void outerMessage(){
System.out.println(InnerOuter.this.str);
}
void innerMessage(){
System.out.println(this.str);
}
}
public static void main(String args[]){
InnerOuter inn = new InnerOuter();
inn.a.outerMessage();
inn.a.innerMessage();
}
}
これをコンパイルして実行すると、
$ java InnerOuter
Outer
Inner
のように出力される。
posted at 19:29 |
category: /Java/tips |
固定リンク(内部クラスから外のクラスを呼ぶ
)
この手の実行時型判定は instanceof または Class クラスの isInstance()
メソッドまたは Class クラスの isAssignableFrom() メソッドを使う。
次の3つは全て同じ意味で、オブジェクト a がクラス A またはそのサブクラスの
インスタンスのときに true を返す。
- a instanceof A
- A.class.isInstance(a)
- A.class.isAssignableFrom(a.getClass())
また、次のように書くと、オブジェクト a がクラス A またはその
スーパークラスのインスタンスかどうかを判定できる。
- a.getClass().isAssignableFrom(A.class)
詳しくは Class クラスのAPI仕様書を参考のこと。
posted at 19:28 |
category: /Java/tips |
固定リンク(あるオブジェクトがあるクラスのオブジェクトかどうかを判定する
)
RMI の例として、クライアント側の名前を登録、解除、および
現在登録されている名前全てを得る RMI サーバを作成。
チャットなどに応用できるだろう。
$ javac MyRemote.java
$ javac MyServer.java
$ javac MyClient.java
$ rmi MyServer
とした後に、
$ java MyServer
と実行し、
同じホスト上で、
$ java MyClient
とすると、
server> John Lennon
-------------------------
server> John Lennon
server> Paul McCartney
server> George Harrison
server> Ringo Starr
-------------------------
server> Paul McCartney
server> Ringo Starr
-------------------------
のように表示されるはず。
posted at 19:03 |
category: /Java/tips |
固定リンク(RMIの例
)
Thread の制御には wait() と notify() が用意されているが、
多くのサンプルでは Thread を起動するたびにインスタンス化して、不要になったら
null を代入することで実現している。それでできてしまうのだから問題ないと言う
考え方もあるだろうが、ここでは wait() notify() を使う方法を考えてみよう。
基本
- wait() でスレッドを待機状態にする
- notify() でスレッドを再開する
- wait() と notify() は synchronized させる
同じスレッドの wait() と notify() を実行することと、実行するときに
syncronized(スレッドのオブジェクト)で同期させる。
以下にアプレットでスレッドを使うときの例を挙げる。
/*
<applet code="AppletOnOff" width="100" height="100">
</applet>
*/
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class AppletOnOff extends Applet{
TextField tf;
long n = 0;
SuspendableThread th;
Button btn;
public void init(){
add(btn = new Button("START"));
add(tf = new TextField(Long.toString(n),10));
btn.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
if(btn.getLabel().equals("START")){
th.restartThread();
btn.setLabel("STOP");
}else{
th.suspendThread();
btn.setLabel("START");
}
}
});
th = new SuspendableThread();
th.start();
}
class SuspendableThread extends Thread{
boolean flag = false;
public void suspendThread(){
flag = false;
}
public void restartThread(){
flag = true;
synchronized(this){
notify();
}
}
public void run(){
while(true){
try{
th.sleep(100);
if(!flag){
synchronized(this){
wait();
}
}
}catch(InterruptedException e){
}
n++;
tf.setText(Long.toString(n));
}
}
}
}
posted at 18:48 |
category: /Java/tips |
固定リンク(ThreadのOn/Off
)
-
Java 3D(TM) API Home Page
-
Sun による本家ホームページ。API の仕様書も読める。
-
Java 3D for Linux: Status and Information
-
Linux 用の Java3D の開発元 Blackdown
-
Java Friendly Society
-
「Java3Dプログラミング・バイブル」についての情報など。
-
Atsushi's Homepage 〜 Java3DTips
-
Atsushi さんによる Tips。大変役に立つページです。
-
Java 3D API Collateral
-
SUN が出している公式のAPI解説書。これを熟読すれば、他の解説書は要らな
いかもしれません。
-
The Java 3D Community
-
総合的なサイトとしてはまずここがお勧め。ただし英語。困ったときは
まずここの FAQ にあたると解決することも。
-
Java 3D Programming
-
英語の本です。ebook Edition をダウンロードすることができます。
API の仕様について細かく解説している本。一通りプログラムの作り方が
わかった後に、自分の実現したいことを調べるのに役にたつ。
-
Java 3D
-
ABA さんのペ−ジ。Java3D で作ったゲ−ムなどがある。
-
vecmath package
-
Kenji Hiranabe さんの unofficial Java3D vecmath package。
「vecmath を理解するための数学」は必読。
-
Archives of JAVA3D-INTEREST@JAVA.SUN.COM
-
java3d-interest メーリングリストの過去記事が読めます。
posted at 13:55 |
category: /Java/Java3D |
固定リンク(Java3D リンク集
)
Fri, 06 Jan 2006
Delaunay2D
posted at 04:10 |
category: /Program |
固定リンク(デローニー
)
EMアルゴリズム
EMアルゴリズムで混合正規分布の学習を行います。
posted at 04:09 |
category: /Program |
固定リンク(EMアルゴリズム
)
Java Web Startの例
Java Web Start を使って Java3D のアプリケーションを起動してみます。
posted at 04:08 |
category: /Program |
固定リンク(Java Web Start で Java3D
)