計算
結晶育成のシミュレーションにMetropolisのモンテカルロ法を導入して温度を一定に出来るようにした。粒子にランダムなスピードの変化を与え、その結果変化するエネルギーdEが負の時は、その変化を受け入れる。正の時は乱数を発生させ、exp(-dE/kT)の確率で変…
宇宙のプログラムをちょっと変えて結晶を育成してみた。周囲を壁に変更し、粒子同士が近づきすぎると反発力が生じるようにして、エネルギーをだんだん下げている。力の形状は F=G*(1-100*exp(-R))/(R^2)*exp(-R)という形。ここでRは粒子間の距離。ちょっと無…
以前に作った銀河の形成のプログラムでは不満な点が一つあった。宇宙は本来無限に続いて中心がないのに、このプログラムでは空間が限られているのでどうしても中心があり、そこが重力の中心になって物質が集まってくる。本来ならば、物質の初期配置の揺らぎ…
ソースコードが1000行を越えてきたので、念のためこちらにも保存。 enchant(); game_size=320; dt=1/10000.0; dt2=0.5*dt*dt; scale=32.0/1.0; //dots/meter Gravity=-9.8; num_frame=0; var EARTH = enchant.Class.create(Sprite,{ initialize:function(){ …
自転車が後ろ向きに走り出すのは腕と足の力のモーメントによってフレームにかかる力の反力を人間側に加えていないためだった。剛体において力と力のモーメントの両方を使って運動を記述する方法に慣れていないため、いろいろとバグが出る。しかし、一通りシ…
意外に難しい。見た目はとりあえず出来たが、実際にはハンドルを握らせることも未だ出来ていない。現在のバージョンでは外から決め打ちで腕と足の角度を決めている。まずは自動的に手足を動かして、BBの鉛直線上に体の重心を持っていく機能をつけたい。 ゆっ…
外力がサスペンションにしかかからない前提で式を立てていたが、動かしてみると不自然な挙動が幾つか発見された。式を見直したところ、フレーム剛体にサスペンション以外から加わる外力とそのモーメントも考慮しなくてはいけないことがわかった。自己無動着…
とりあえずサスペンションを導入することができた。まだおかしいところも残っているかもしれないが、一応動くようになってくれて嬉しい。つぎは地形エディターを導入したい。
そろそろシミュレーターにサスペンションを導入しようと思い、本格的に計算をやって見た。意外に手ごわい。サスペンションはフレーム剛体と完全に一緒に回転する訳ではないので位置表示に絶対座標を用い、その他のフレーム上の点はフレームと一緒に回転する…
かなりの改良を進めた。ホイールの回転を取り入れ、転がり抵抗も考慮した計算になった。全体がスパゲッティーになってきたので、サスペンションを入れる前に整理し直す必要がある。
とりあえず、フルリジッドだけど動くようになったけど、同時にだいぶんコードが長くなってきた。 http://jsdo.it/tasanokona/s7Q2/(Chromeだとスムースに動きますが、それ以外のブラウザでは遅い、あるいは全く動かないかもしれません。) ここまでは完全剛…
フレームのオブジェクトにホイールとサスペンションのオブジェクトを従属させることにした。この調子で行くと、乗る人間もフレームに従属することになりそうだ。 今日はとりあえずフレームとホイールのデータ設定と描画の途中まで。フレームは全体としてスプ…
やはりフレームが0.1%ほど伸び縮みして振動するときの様子を振動を1マイクロ秒単位で計算するのは馬鹿らしい。カーボンフレームの振動吸収性は再現できるかもしれないが、計算速度が落ちてリアルタイムで結果を表示できなくなってしまう。よって、フレーム全…
Enchant.jsでリアルタイム表示が可能になったので、自転車シミュレータ計画再開。 今度はフォークだけでなく、フレームも人間もシミュレートしてみたい。 剛体の計算はいろいろと矛盾が出てきそうなので、質点間を張力で結ぶモデルにしたい。剛体的なものも…
初期角運動量を与えることで、だいぶん太陽系のような感じになってきた。 それから力のダンピングが完全に粒子間で対称になるように改良。これで超新星爆発はなくなった。動画は16倍速。 // forked from tasanokona's "太陽系の形成" http://jsdo.it/tasanok…
昨晩、梅雨入りというニュースを聞く。今朝は雨が降るとみて起きず。実際どの程度降っていたかは不明。 夜、太陽系の形成プログラムを高速化。重力の計算を個々のスプライトのイベントではなく、coreのほうでまとめて行うことにした。 それから、クリックし…
星のクラスを作ってみた。まわりのすべての星のから受ける重力を計算して、その合計で星が加速される。一つクラスを作ると後はいくつでも星を追加することができるので、他体型のシミュレーションが簡単にできる。星を1000個ばらまいてみたら銀河の形成と消…
フレームやら人間やらの動きをシミュレーションする基本プログラムの出来を確かめるため、簡単なモデルで計算。 1kgの質点三つを4mの長さの棒を二本使って順番につなぐ。棒の重さはゼロ。真中の質点から生えている二本の棒を、5N/mのトルクで回す。求心力を…
Macwiki様の3次元ベクトルクラスを使わせていただいています。 http://macwiki.sourceforge.jp/wiki/index.php/Vector3%E3%82%AF%E3%83%A9%E3%82%B9 using namespace std; #include<iostream> #include<math.h> #include<stdio.h> #include"vector3.h" #define PI 3.1415926535897932384</stdio.h></math.h></iostream>…
頑張ってアニメ化してみた。awkでgnuplot操作用スクリプトを吐き出すスクリプトを書いて、そのスクリプトでgnuplotに400枚絵を吐き出させて、それをimagemagicでつないでgifアニメにして、それからgiamでaviに変換。意外に大変だったが、awkやgnuplotの使い…
Flare氏からコンプレッションに対してリバウンドのダンピングを強くするとよいとのコメントをいただいたので、プログラムを少し改造して、リバウンドとコンプレッションのダンピングを別々に設定できるようにした。それから、これまでの空気圧は絶対圧で表示…
シミュレーションなので、実際には試してみることが難しい状況を計算してみた。 半径10cmの根っこに20km/hで突っ込む 根っこ半径10cm(半分地面に埋まっている)が5本、時速20km、ばね上重量40kg、ばね下重量2kg、サスの圧力は66psi。 吹っ飛んでしまう。サ…
半径4cmの根っこ(半分地面に埋まっている)を5本連続、時速20kmで突っ切るときのシミュレーション。空気圧は66psi。ダンピングは25kg重/(m/s)。 後半、浮いている時間が長くなっている。しかし、この計算ではだんだんサスペンションが伸びてくる。逆のイメ…
これが計算をしたいというのが、そもそもの動機。半径4cmの根っこ(半分地面に埋まっている)を5本連続、時速20kmで突っ切るときのシミュレーション。空気圧は36psi。ダンピングは25kg重/(m/s)。 最初の根っこで底付きして、吹っ飛ばされほとんどタイアが宙…
サスペンションの効果を計算する前に、まず物体をタイヤで乗り越える際にどのような上下運動が加わるのかを検討してみた。 図のように半径R1の根っこが半分地面に埋まっているとき、半径R2のタイヤで乗り越えることを考える。この場合ホイール中心の描く軌跡…
#include<iostream> #include<math.h> #include<stdio.h> #define PI 3.141592653589793238463 #define G 9.80665 using namespace std; const double rigid=1000/1e-4; //0.1mmで100kg重 const double S=PI*1.5e-2*1.5e-2; //直径3cmのピストン const double L0=10e-2;//ストローク長10</stdio.h></math.h></iostream>…
とりあえずできた。プログラムも少し修正あり。まずは結果。空気圧は66psi、ダンピングは前回ぎりぎり振動がなかった50kg重/(m/s)とした。 根っこの頂点を超えた後、タイアが宙に浮き、地面との接触力がなくなってしまっていることが分かる。その時間は約0.0…
気になるのでタイア直径29インチでもやってみた。26インチと比べて有意な差はないようだ。
ダンピング定数を25kg重/(m/s)と、最初の値の半分にしてみた。おお!大分接地がよくなった。
とりあえずできた。 #include<iostream> #include<math.h> #include<stdio.h> #define PI 3.141592653589793238463 #define G 9.80665 using namespace std; const double rigid=1000/1e-4; //0.1mmで100kg重 const double S=PI*1.5e-2*1.5e-2; //直径3cmのピストン const double L0=10e</stdio.h></math.h></iostream>…