2nd order differential equation solution cant fit the problem
1 次查看(过去 30 天)
显示 更早的评论
I try to simulate the swinging of a Garage door!
The soluation should be found via Lagrange. I get all the derivations as is shown in the sector with the "L_1,L_2,..."
But when solving via ode45 it shows me a normal sinus function and is far from what it should look like
clear
syms phi(t) m c g alpha(t) CB_x CB_z BA_x BA_z v_x v_z x0
m= 100;
copt= 3558.7;
g= 9.81;
x0=1.360564445;
k=0.75;
phi_d=diff(phi);
phi_dd= diff(phi,t,2);
alpha(t)= asin((1.7-2.1*cos(phi(t)))/3.6);
CB_x= -2.1*sin(phi);
CB_z= 2.1*cos(phi);
BA_x= 1.8*cos(alpha(t));
BA_z= 1.8*sin(alpha(t));
v_x=diff(CB_x+BA_x);
v_z=diff(CB_z+BA_z);
v=sqrt(v_x^2+v_z^2);
r1=((CB_x+BA_x)^2+(CB_z+BA_z)^2)^0.5;
alpha_d=diff(alpha(t),t);
x=sqrt(1.8^2+0.6^2-2*1.8*0.6*cos(phi(t)));
U=1/2*copt*k*(x-x0)^2;
W=-m*g*(CB_z+BA_z);
V=U+W;
T_trans=0.5*m*v^2;
T_rot=1/3*m*3.6^2*alpha_d^2;
T=T_trans+T_rot;
L_1=diff(diff(T,phi_d),t);
L_2=diff(T,phi(t));
L_3=diff(V,phi(t));
% L_1=diff(diff(T,phi_d),phi)*phi_d+diff(diff(T,phi_d),phi_d)*phi_dd;
% phi_dd_test=(diff(diff(T,phi_d),phi)*phi_d-L_3+L_2)/diff(diff(T,phi_d),phi_d);
F=L_1-L_2+L_3==0;
[Y,S] = odeToVectorField(F);
tspan=[0 30];
y0_45=[deg2rad(35.9) 0];
M = matlabFunction(Y,'vars', {'t','Y'});
[t,Y] = ode45(@(t, Y) M(t,Y),tspan,y0_45);
plot(t, Y, 'linewidth', 1.5)
xlim([0.00 10.00])
ylim([-4.00 4.00])
zlim([-1.00 1.00])
legend(["Winkel","Winkelgeschwindigkeit"])
xlabel("Time")
2 个评论
Sam Chak
2022-6-14
Based on what you described, does it suggest that the Lagrangian formulation should be checked again?
回答(1 个)
Karan Singh
2023-10-4
Hi Patrick,
From what I understand, the goal is to simulate the swinging motion of a garage door using Lagrange equations and solving the resulting differential equation using “ode45” in MATLAB. However, there are a few issues in the code that might be causing the unexpected results. Let's go through them:
- In the definition of “CB_x” and “CB_z”, you have used “sin(phi)” and “cos(phi)” instead of “sin(phi(t))” and “cos(phi(t))”, respectively. You need to evaluate these trigonometric functions at the current time t by replacing “phi” with “phi(t)”. Similarly, in the definition of “alpha(t)”, you need to replace “phi” with “phi(t)”.
- In the definition of “v_x” and “v_z”, you have used “diff(CB_x + BA_x)” and “diff(CB_z + BA_z)”, respectively. However, you need to evaluate these derivatives at the current time “t” by replacing “diff(CB_x + BA_x)” with “diff(CB_x + BA_x, t)” and “diff(CB_z + BA_z)” with “diff(CB_z + BA_z, t)”.
- In the definition of x, you have used “cos(phi(t))” instead of “cos(alpha(t))”. Replace “cos(phi(t))” with “cos(alpha(t))”.
- The equation “F = L_1 - L_2 + L_3 == 0” represents the Lagrange equation. However, it seems that you have commented out a line of code that calculates “phi_dd_test”. Uncomment that line and assign “phi_dd_test” the value of “(diff(diff(T,phi_d),phi)*phi_d - L_3 + L_2) / diff(diff(T,phi_d),phi_d)”.
Attached below are some documentation links that you may find helpful:
- Ordinary differential equations - MATLAB (mathworks.com)
- Symbolic Math Toolbox Documentation (mathworks.com)
Hope this helps!
Karan Singh Khati
0 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Interpolation 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!