Hi everyone!
I'm writing a code to simulate a car's 2D rigid motion: I need to contemporarily solve 35 equations, 7 differential and 28 algebraic, so I'm using ODE15s.
Simpler version of this model (up to 19 equations) worked (after long fights), but now I'm stuck: after declaring where differential equations are in the M matrix, Matlab warns me that:
Warning: Matrix is singular, close to singular or badly scaled. Results may be inaccurate. RCOND = NaN. > In ode15s (line 589) Warning: Matrix is singular, close to singular or badly scaled. Results may be inaccurate. RCOND = NaN.
What shall I do to sort this out?
Here's the code (pacejka and slittamenti are functions):
M(13,13)=1;M(14,14)=1;M(15,15)=1;M(24,24)=1;M(25,25)=1;M(26,26)=1;M(27,27)=1;options = odeset('Mass',M,'RelTol',1e-8,'AbsTol',tolleranze);y0_=[alfa_1_0; alfa_1_0; alfa_2_0; alfa_2_0; F_y_1_0; F_y_1_0; F_y_2_0; F_y_2_0; F_x_1_0; F_x_1_0; F_x_2_0; F_x_2_0; v0; r0; u_0; Z_statico_1; Z_statico_1; Z_statico_2; Z_statico_2; slip_ratio_1_0; slip_ratio_1_0; slip_ratio_2_0; slip_ratio_2_0; omega_1_0; omega_1_0; omega_2_0; omega_2_0; schiacciamento_1_0; schiacciamento_1_0; schiacciamento_2_0; schiacciamento_2_0; R_puro_rotolamento_1_0; R_puro_rotolamento_1_0; R_puro_rotolamento_2_0; R_puro_rotolamento_2_0];[t,y] = ode15s(@(t,y) longitudinale_puro_nomi_veri(t,y,J_1,J_2,... delta_v_0,tau_1,tau_2,a_1,a_2,t_1,t_2,m,J_z,J_zx,... dati_pacejka_r,dati_pacejka_f,R_1,R_2,g,h,Cz_1,Cz_2,... Z_statico_1,Z_statico_2,... theta_11,theta_12,theta_21,theta_22,l,tspan),tspan,y0,options);
Here's the function where all the equations are written:
function out=longitudinale_puro_nomi_veri(t,y,J_1,J_2,... delta_v_0,tau_1,tau_2,a_1,a_2,t_1,t_2,m,J_z,J_zx,... dati_pacejka_r,dati_pacejka_f,R_1,R_2,g,h,Cz_1,Cz_2,... Z_statico_1,Z_statico_2,... theta_11,theta_12,theta_21,theta_22,l,tspan)delta_v=0;momento_11=0; % Torque
momento_12=0;momento_21=0;momento_22=0;delta_11=tau_1*delta_v; % Wheel angles
delta_12=tau_1*delta_v; delta_21=tau_2*delta_v;delta_22=tau_2*delta_v;% Unknowns:
alfa_11=y(1);alfa_12=y(2);alfa_21=y(3);alfa_22=y(4);F_y_11=y(5);F_y_12=y(6);F_y_21=y(7);F_y_22=y(8);F_x_11=y(9);F_x_12=y(10);F_x_21=y(11);F_x_22=y(12);v=y(13);r=y(14);u=y(15);F_z_11=y(16);F_z_12=y(17);F_z_21=y(18);F_z_22=y(19);epsilon_11=y(20);epsilon_12=y(21);epsilon_21=y(22);epsilon_22=y(23);omega_11=y(24);omega_12=y(25);omega_21=y(26);omega_22=y(27);schiacciamento_11=y(28); schiacciamento_12=y(29); schiacciamento_21=y(30);schiacciamento_22=y(31);R_pr_11=y(32);R_pr_12=y(33);R_pr_21=y(34);R_pr_22=y(35);out=[-alfa_11+delta_11-atan((v+r*a_1)/(u-r*t_1/2)); % Congruenza: deriva alfa_11
-alfa_12+delta_12-atan((v+r*a_1)/(u+r*t_1/2)); % Congruenza: deriva alfa_12
-alfa_21+delta_21-atan((v-r*a_2)/(u-r*t_2/2)); % Congruenza: deriva alfa_21
-alfa_22+delta_22-atan((v-r*a_2)/(u+r*t_2/2)); % Congruenza: deriva alfa_22
-F_y_11+pacejka('Fy0',F_z_11,0,-alfa_11*180/pi,-epsilon_11,dati_pacejka_f); % Legame costitutivo F_y_11
-F_y_12+pacejka('Fy0',F_z_12,0,-alfa_12*180/pi,-epsilon_12,dati_pacejka_f); % Legame costitutivo F_y_12
-F_y_21+pacejka('Fy0',F_z_21,0,-alfa_21*180/pi,-epsilon_21,dati_pacejka_r); % Legame costitutivo F_y_21
-F_y_22+pacejka('Fy0',F_z_22,0,-alfa_22*180/pi,-epsilon_22,dati_pacejka_r); % Legame costitutivo F_y_22
-F_x_11+pacejka('Fx0',F_z_11,0,-alfa_11*180/pi,-epsilon_11,dati_pacejka_f); % Legame costitutivo F_x_11
-F_x_12+pacejka('Fx0',F_z_12,0,-alfa_12*180/pi,-epsilon_12,dati_pacejka_f); % Legame costitutivo F_x_12
-F_x_21+pacejka('Fx0',F_z_21,0,-alfa_21*180/pi,-epsilon_21,dati_pacejka_r); % Legame costitutivo F_x_21
-F_x_22+pacejka('Fx0',F_z_22,0,-alfa_22*180/pi,-epsilon_22,dati_pacejka_r); % Legame costitutivo F_x_22
(F_y_11+F_y_12+F_y_21+F_y_22)/m-u*r; % Equilibrio trasversale
((F_y_11+F_y_12)*a_1-(F_y_21+F_y_22)*a_2)/J_z; % Equilibrio imbardata
(F_x_11+F_x_12+F_x_21+F_x_22)/m-(F_y_11*delta_11+F_y_12*delta_12)/m+v*r; % Equilibrio longitudinale
-F_z_11+Z_statico_1-theta_11*(F_y_11+F_y_12+F_y_21+F_y_22)-theta_12*((F_y_11+F_y_12)*a_1-(F_y_21+F_y_22)*a_2)-(F_x_11+F_x_12+F_x_21+F_x_22-(F_y_11*delta_11+F_y_12*delta_12))*h/l; -F_z_12+Z_statico_1+theta_11*(F_y_11+F_y_12+F_y_21+F_y_22)+theta_12*((F_y_11+F_y_12)*a_1-(F_y_21+F_y_22)*a_2)-(F_x_11+F_x_12+F_x_21+F_x_22-(F_y_11*delta_11+F_y_12*delta_12))*h/l; -F_z_21+Z_statico_2-theta_21*(F_y_11+F_y_12+F_y_21+F_y_22)-theta_22*((F_y_11+F_y_12)*a_1-(F_y_21+F_y_22)*a_2)+(F_x_11+F_x_12+F_x_21+F_x_22-(F_y_11*delta_11+F_y_12*delta_12))*h/l; -F_z_22+Z_statico_2+theta_21*(F_y_11+F_y_12+F_y_21+F_y_22)+theta_22*((F_y_11+F_y_12)*a_1-(F_y_21+F_y_22)*a_2)+(F_x_11+F_x_12+F_x_21+F_x_22-(F_y_11*delta_11+F_y_12*delta_12))*h/l; -epsilon_11+scorrimento_11(u,R_pr_11,omega_11); % Congruenza: slip x_11
-epsilon_12+scorrimento_12(u,R_pr_12,omega_12); % Congruenza: slip x_12
-epsilon_21+scorrimento_21(u,R_pr_21,omega_21); % Congruenza: slip x_21
-epsilon_22+scorrimento_22(u,R_pr_22,omega_22); % Congruenza: slip x_22
(momento_11-F_x_11*(R_1-schiacciamento_11))/J_1; % Bilancio ruota 11
(momento_12-F_x_12*(R_1-schiacciamento_12))/J_1; % Bilancio ruota 12
(momento_21-F_x_21*(R_2-schiacciamento_21))/J_2; % Bilancio ruota 21
(momento_22-F_x_22*(R_2-schiacciamento_22))/J_2; % Bilancio ruota 22
-schiacciamento_11+F_z_11/Cz_1; % Schiacciamento 11
-schiacciamento_12+F_z_12/Cz_1; % Schiacciamento 12
-schiacciamento_21+F_z_21/Cz_2; % Schiacciamento 21
-schiacciamento_22+F_z_22/Cz_2; % Schiacciamento 22
-R_pr_11+R_1-schiacciamento_11/3; % Raggio puro rotolamento 11
-R_pr_12+R_1-schiacciamento_12/3; % Raggio puro rotolamento 12
-R_pr_21+R_2-schiacciamento_21/3; % Raggio puro rotolamento 21
-R_pr_22+R_2-schiacciamento_22/3]; % Raggio puro rotolamento 22
Best Answer