Как остановить перекрытие блоков в анимации n связанных масс в визуальном питоне? - PullRequest
0 голосов
/ 09 ноября 2019

Этот вопрос может быть больше физической проблемой, чем проблемой vpython, потому что я не знаю, ошибся ли код или физика. Я пытаюсь написать программу по анимации системы n связанных пружинных масс, используя визуальный модуль python. ,Я не вижу, где это пошло не так, но массы (даже когда их нет меньше двух) часто перекрывают друг друга, Как я могу изменить граничные условия или другие вещи, чтобы они не перекрывались (как в действительности)? Код:

from visual import *
from math import cos

m=[1,2]#list of masses
k=[1,2,1]#list of spring constants
R=len(m)#number of masses

floor=box(pos=(0,-0.5,0),size=(10,0.01,10),color=color.blue,material=materials.wood)#resting table
boxlist=[]#for creation of the masses
for z in range(0,R):
    boxlist.append(box(pos=(4*z,0,0),size=(0.5,0.5,0.5),color=color.red,material=materials.wood))
#a is the matrix whose eigenvalues are the square of angular frequencies,and eigenvectors are the amplitudes
a=[[0 for r in range(R)]for c in range(R)]
for i in range(0,R):
    if i>0:
        a[i][i-1]=-k[i]/float(m[i])
    if i<R-1:
        a[i][i+1]=-k[i+1]/float(m[i])
    a[i][i]=k[i]/float(m[i])+k[i+1]/float(m[i])

val=eig(a)[0]
vec=eig(a)[1]

t=0
dt=0.01
s=0
S=[]
while True:
    rate(100)
    for i in range(0,R):
        for j in range(0,R):
            s+=vec[j][i]*cos(((val[j])**0.5)*t)#x=Acos(wt),allowing phase angle to be zero
        S.append(s)
        s=0
    for z in range(0,R):
        boxlist[z].pos.x=S[z]
    S=[]
    t+=dt
...