Этот вопрос может быть больше физической проблемой, чем проблемой 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