2

k = 10 ^ 5 N/mの硬いばねで接続された0.1kgの等しい質量の2つの質量があります。ばねの残りの長さ(および2つの質量間の初期距離)はd0=0.15mです。

質量1の初速度(2.77、1.25、0)m / sであり、質量2の初速度(1.25、4、0)m/sです。

空気抵抗を無視して、重力下でのこのシステムの飛行をシミュレートするコードを書きたいと思います。また、システムの重心に3番目の球を配置したいと思います。

これが私がこれまでに書いたものです:

from visual import *

mass1 = sphere(radius = 0.01)
mass2 = sphere(pos = (0.15, 0, 0), radius = 0.01)
COM = sphere(pos = (0.15/2, 0, 0), radius = 0.01)

mass1.m = 0.1
mass2.m = 0.1

k = 1*10**5

mass1.v = vector(2.77, 1.25, 0)
mass2.v = vector(1.25, 4, 0)

mass1.p = mass1.v*mass1.m
mass2.p = mass2.v*mass2.m

dt = 0.0001
t = 0

while 1:
    g = 9.8
    d = (mass1.pos-mass2.pos)/mag(mass1.pos-mass2.pos)

    Ft12 = mass1.m*d*k*0.15
    Ft21 = mass2.m*d*k*0.15

    Fnet = Ft12 + Ft21

    mass1.p += Fnet*dt
    mass2.p += Fnet*dt

    mass1.vA = 0.5*(mass1.v + (mass1.p/mass1.m))
    mass2.vA = 0.5*(mass1.v + (mass2.p/mass2.m))

    mass1.pos += mass1.vA*dt
    mass2.pos += mass2.vA*dt
    COM.pos = (mass1.pos-mass2.pos)/2 + mass1.pos

    t += dt

Ft12はボール1からボール2への張力であり、Ft21は2から1です。もちろん、正確な結果が得られればこれを投稿しませんが、簡単に得られる結果すら得られません。観察する。画面がすぐに空白になり、何が起こっているのかを確認する機会がありません。基本的には、このシステムを重力の影響下で「投げる」ことを望みます。この場合、COMの軌道は放物線の軌道になると想像できます。どんな助けでも大歓迎です。部隊が間違っている場合、または場所によっては追加する必要がある場合は、お知らせください。

みんなありがとう!

4

2 に答える 2

3

私はこの行について重大な疑問を持っています:

dt += 1

dtタイムステップだと思います。ループを一巡するたびに、時間ステップを 1 秒ずつ増やしています。通常、時間をインクリメントします。

t += dt

しかし、まだ時間変数がありません。タイム ステップが大きくなると、地獄がすべて解き放たれます。今のところ、単純にdt += 1行を削除します。

コードの残りの部分については、詳しく見ていないので、あなたの表記が何を意味するのか推測できません。コードにはさらに多くの問題がある可能性があります。

于 2012-03-01T21:05:13.923 に答える
2

アニメーションを遅らせている「スリープ」時間はありません。時間の経過とともに球体が画面から消えると (私は実際にその物理を見ていないので、それが必要かどうかはわかりません)、タイム ステップ間に遅延がないため、球体は即座に消えるように見えます。

もし、あんたが

from time import sleep

次に、代わりに次のループを実行できます

dt = 0.0001
for step in range(1000):
    g = 9.8
    d = (mass1.pos-mass2.pos)/mag(mass1.pos-mass2.pos)

    Ft12 = mass1.m*d*k*0.15
    Ft21 = mass2.m*d*k*0.15

    Fnet = Ft12 + Ft21

    mass1.p += Fnet*(dt*step)
    mass2.p += Fnet*(dt*step)

    mass1.vA = 0.5*(mass1.v + (mass1.p/mass1.m))
    mass2.vA = 0.5*(mass1.v + (mass2.p/mass2.m))

    mass1.pos += mass1.vA*(dt*step)
    mass2.pos += mass2.vA*(dt*step)
    COM.pos = (mass1.pos-mass2.pos)/2 + mass1.pos
    sleep(0.5)

無限ループが好きではないため、while(1) のみを削除しました =P

これにより、少なくとも 3 つの球体が何をしているかを確認できるので、それらが期待どおりに動作するかどうかを調べることができます。

于 2012-03-01T21:16:33.337 に答える