2017-03-06 219 views
2

我一直试图数值求解对于基本谐波振荡器的曲线图,但是当在对象上的加速度成比例,从中心的距离的倒数发生问题:Python的数值求解谐振子图形产生不想要的结果

import math 
from pylab import * 
xg = [2] 
xt = [0] 
k = 1 

dt = 1/1000 
Vx = 0 
for i in range(800000): 
    a = -1/xg[i-1] #acceleration on the object 
    Vx = Vx + dt*a 
    xg.append(xg[i-1]+Vx*dt) 
    xt.append(i*dt) 
plot(xt,xg) 
show() 

正如你所看到的,它似乎倾泻而下,而不是因为某种原因返回。

我想知道是什么原因造成这种情况发生,我一直在努力解决这个问题了几个小时。

是的,我是新来的python,堆栈交换和数值解决问题。任何反馈表示赞赏

+0

您的代码在我的电脑上无法使用。它只是按照我的预期在屏幕上打印一个点。我想知道你怎么能制作这样的图表? – phil

+0

请注意,'dt = 1/1000'将在Python中始终为'0'。 'dt = 1.0/1000'可能是你想要的。 – phil

+1

我猜他正在使用python3。关于你的问题:谐波振荡器的加速度与距离成正比。因此,您必须计算加速度:'a = -xg [i-1]'。此外,你会得到这种一阶积分的漂移。 – jotasi

回答

2

试试这个

import math 
from pylab import * 
xt = [2] 
t = [0] 
k = 1 

dt = 0.0001 
Vx = 0 
for i in range(800000): 
    t.append(dt*i) 
    a = -k*xt[i] 
    xt.append(xt[i] + dt*Vx) 
    Vx = Vx + dt*a 
plot(t,xt) 
show() 

你这样结束了:(我也减少了时间步长FYI至1/10000) enter image description here

0

假设你想加速比例到距离的倒数,当xg接近0时,数值将发散,引起数值不稳定。