Найти - Пользователи
Полная версия: Движение тележки с подвешенным грузом.
Начало » Центр помощи » Движение тележки с подвешенным грузом.
1
Ressy
Здравствуйте уважаемые форумчане. Пытаюсь смоделировать такую систему, как на рисунке по ссылке, с той разницей, что слева к тележке приложена пружина. Мне требуется помощь в написании программы , которая будет выводить графики колебаний системы и её спектр.
Вот мой код:
 %typeset_mode True
import numpy as np
import scipy
import matplotlib.pyplot as plt
import numpy.fft as fft
import matplotlib
import matplotlib.pyplot as plt1
import matplotlib.pyplot as plt2
from scipy import integrate, optimize, interpolate
from scipy.special import gamma
%var angle1, x, x_dot,x1dot, x2dot, epsilon, A, Aa, alpha, alpha_dot, m1, m2, k1,g, l1, Ek, Ep, Lagran1, Lagran2
#х-путь, alpha - угол отклонения шара, m1-масса тележки, m2-масса шара, k1-жесткость пружины,g-9.81, l1-длинна нити, за которую подвешен шар
Ek = m2*((x_dot^2)+(2*x_dot*l1*cos(alpha)*alpha_dot)+(l1^2)*(alpha_dot^2)*((cos(alpha)**2)-(sin(alpha)**2)))/2
Ep = m2*g*(l1-l1*cos(alpha))+(k1*(x^2)/2)
L = Ek - Ep
Ldiff = L.diff(x_dot )
Ldiff2 = L.diff(alpha_dot)
t=var('t')
xdot_tmp = var ('X_Dot')
alphadot_tmp = var ('Alpha_Dot')
alpha_tmp = function ('Alpha')(t)# For substitution alpha
x_tmp = function ('X')(t) #For substitution x
angle = var ('theta')
Ldiff3 = Ldiff.subs([x_dot==x_tmp.diff(t), x==x_tmp ,alpha==alpha_tmp,alpha_dot==alpha_tmp.diff(t)]).diff(t)
Ldiff4 = Ldiff2.subs([x_dot==x_tmp.diff(t), x==x_tmp ,alpha==alpha_tmp,alpha_dot==alpha_tmp.diff(t)]).diff(t)
Lagran1 = Ldiff3-L.diff(x)-A*sin(angle*t)
Lagran2= Ldiff4-L.diff(alpha)
print ('Lagran1')
Lagran1
print ('Lagran2')
Lagran2
omega =var ('omega') #For subs second derivative alpha. It is pendulum acceleration
Aa =var('AA') #For subs second derivative x. It is trolley acceleration
eq1=Lagran1.subs([x_tmp.diff(t)==x_dot,x_tmp==x,alpha_tmp.diff(t)==alpha_dot,alpha_tmp==alpha, alpha_tmp.diff(t).diff(t)==omega, x_tmp.diff(t).diff(t)==Aa])
print ('eq1')
eq1
eq2=Lagran2.subs([x_tmp.diff(t)==x_dot,x_tmp==x,alpha_tmp.diff(t)==alpha_dot,alpha_tmp==alpha, alpha_tmp.diff(t).diff(t)==omega, x_tmp.diff(t).diff(t)==Aa])
print ('eq2')
eq2
sol_list=solve([ eq1,eq2  ],[Aa,omega ])
a111=sol_list[0][0].rhs()
a112=sol_list[0][1].rhs()
a111=a111.subs(m1==100,m2==10,l1==5,g==9.81,k1==2,A==0,angle==30)
print ('a111')
a111
a112=a112.subs(m1==100,m2==10,l1==5,g==9.81,k1==2,A==0,angle==30)
print ('a112')
a112
def fun_ode(y,t_num):
    x_num       =y[0]
    v_num       =y[1]
    alpha_num   =y[2]
    alphadot_num=y[3]
    xdot1       =v_num
    xdot2       =alphadot_num #alpha_dot
    v1dot=a111.subs(x==x_num,alpha_dot==alphadot_num,alpha==alpha_num,t==t_num)
    v2dot=a112.subs(x==x_num,alpha_dot==alphadot_num,alpha==alpha_num,t==t_num)
    return[xdot1,v1dot,xdot2,v2dot] # xdot1 -скорость тележки, v1dot-ускорение тележки, xdot2-скорость шара, v2dot-ускорение шара. 
t_span = np.arange(0,20.0, 0.0001)
x_0 =0.0001
v_0 =0.0001
x1_0=0.0001
v1_0=0.0001
y_0 = [x_0,v_0,x1_0,v1_0]
dt = t_span[1]-t_span[0]; dt
y = integrate.odeint(fun_ode, y_0, t_span,  rtol=1e-12, atol=1e-12)
bp_x = t_span
bp_y = y [:,0]
plt1.figure(figsize=(15,5))
probes_no = len(y)
rms_spec = abs(fft.fft(bp_y))
rms_spec_shift = fft.fftshift(rms_spec)
f_span=fft.fftshift(fft.fftfreq(probes_no, d=dt))
plt1.plot(f_span,rms_spec_shift, linewidth=2, linestyle="-", color="blue")
plt2.plot(f_span,rms_spec.imag,color="red")
plt1.grid()
plt1.xlim([-5,5])
plt1.show()
plt2.figure(figsize=(15,5))
plt2.plot(bp_x,bp_y)
plt2.grid()
plt2.show()

Вопросы в следующем:
1) Почему python ругается на интегрирование odeint? Вот сама ошибкаext/sage/sage-8.7_1804/local/lib/python2.7/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.
warnings.warn(warning_msg, ODEintWarning).
Как я понял, питону не нравится размерность шага интегрирования, но как бы я её не менял проблема не исчезает.
2) Почему графики некорректны?
Возможно проблема в том, что из функции я вывожу значение “xdot1”, которое сокращается при раскрытии скобок в уравнении "eq2.
Однако я не знаю как решить эту проблему, так что буду благодарен любой помощи. Заранее спасибо.
Ressy
Может кто-то дать подсказку, пожалуйста? Я немного в тупике если честно.
doza_and
Ressy
Может кто-то дать подсказку, пожалуйста?
Решать проблемы надо последовательно. Сначала разбираться с интегратором потом с картинками.
Почему вы решили что проблема с шагом? Она на Dfun ругается.
? ==
 v1dot=a111.subs(x==x_num,alpha_dot==alphadot_num,alpha==alpha_num,t==t_num)
Вы точно это имели ввиду?
Числа sympy и numpy Могут иметь разный и несовместимый тип, так что результат subs возможно надо явно привести к float.

Чтобы не быть в тупике смотрите по ходу написания программы что у вас получается.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB