2nd order differential equation solution cant fit the problem
1 view (last 30 days)
Show older comments
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 Comments
Sam Chak
on 14 Jun 2022
Based on what you described, does it suggest that the Lagrangian formulation should be checked again?
Answers (1)
Karan Singh
on 4 Oct 2023
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 Comments
See Also
Categories
Find more on Interpolation in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!