###オイラー法によるシミュレーション
現在、オイラー法によるシミュレーションのコードを書いています。
その結果をエクセルでグラフ化してみました。(下の写真)
すると、周期を細かくしたら、グラフは内に入っていくはずなのですが、
下の画像では、外側にどんどん発散していく形になってしまいます。
どこが、間違っているのでしょうか?
###問題
ばね定数k
のばねの先についている質量m
の物体には、
重力mg
と、ばねの伸びy
に比例したばねの復元力-ky
と
速度v
に比例した抵抗力-Rv
(Rは抵抗係数)が働いている。
【初期条件】
位置 y0 = 1
初速度 v0 = 0
周期 dt = 0.0137
m = 1
g = 9.8
k = 22
R = 1.2
###コード
c
1#include <stdio.h> 2 3int main(void){ 4 float v1, y1, yh, vh, c1, c2; 5 float v0=0; 6 float y0=1; 7 float k=22; 8 float m=1; 9 float R=1.2; 10 float dt=0.0137; 11 float t=0; 12 int i=0; 13 14 c1 = k/m; 15 c2 = R/m; 16 17 while(i<300){ 18 printf("i回目 = %d\n", i); 19 printf("t = %f\n", t); 20 printf("v0 = %f\n", v0); 21 printf("y0 = %f\n", y0); 22 printf("\n"); 23 24 //仮半数先 25 yh = y0 + v0 * 0.5 * dt; 26 vh = v0 + (-c1*y0 -c2*v0) * 0.5 * dt; 27 v1 = v0 + (-c1*yh -c2*vh) * dt; 28 y1 = y0 + vh * dt; 29 30 v0 = v1; 31 y0 = y1; 32 i++; 33 t = i * dt; 34 } 35} 36
以上、よろしくお願いいたします。
ご指摘ありがとうございます。
> すると、周期を細かくしたら、グラフは内に入っていくはずなのですが、
> 下の画像では、外側にどんどん発散していく形になってしまいます。
「内」とか「外」とか言われてもどういう意味なのかわかりません.
(3つのグラフは単に横軸方向のスケールが異なるだけにしか見えません.
横軸が 時刻t ではなく,演算の回数i相当の何か(?) になってませんか?)
少なくとも青とオレンジで描画されたグラフを見るに振幅は減少していっているので
> 速度vに比例した抵抗力-Rv
の効果に依ると思われるエネルギーの減少が起きている(=「発散」はしていない)ように見えます.
あと,
> g = 9.8
コレ使われてないように見えますが…?
あなたの回答
tips
プレビュー