por toñuko
- 26 Jun 2014, 19:38

-
Perfil básico de usuario
- 26 Jun 2014, 19:38
#340823
Buenas tardes.
Estoy escribiendo un programa en MatLab que me ayude con el cálculo de la geometría de la dirección de un monoplaza.
Explico por encima como funciona todo para el que le interese:
Aquí vienen los problemas:
Para simular el movimiento defino una función con las longitudes para las cuales quiero simular, y la dejo en función de los ángulos de ambas ruedas, con fsolve resuelvo.
Problema: Para resolver con fsolve hay que definir una función y guardarla en un archivo de texto traté de resolver esto con:
Pero no hay manera, aunque crea el archivo, no espera a que se haya guardado para intentar leerlo, así que da error, o lee el archivo de la ultima simulación.
He intentado meter un pause pero nada, creo que hay ciertas cosas que no actualiza hasta salir de un bucle. ¿Alguien sabe como puedo solucionar esto?
Todo esto es para el diseño de un prototipo de Formula Student. Si hay interés y el jefe no lo considera spam puedo abrir un hilo para hablar del tema.
Un saludo y perdón por el tocho!
Estoy escribiendo un programa en MatLab que me ayude con el cálculo de la geometría de la dirección de un monoplaza.
Explico por encima como funciona todo para el que le interese:
Contenido
La dirección será de cremallera-piñón, por lo que el mecanismo está compuesto por 5 elementos + bastidor. Un sistema de dirección debe hacer que el centro instantáneo de rotación de las 4 ruedas coincida permanentemente, es decir, las perpendiculares a la velocidad lineal de las ruedas deben cruzarse en un punto único en todo momento. Para que quede claro al que no lo sepa, la rueda interior y exterior en una curva no giran lo mismo.
Para lograr esto he escrito un programa al que doy unos valores iniciales de las longitudes de las barras y el ángulo del acoplador de la mangueta con respecto a la rueda. A partir de estos valores calcula unos cercanos que cumplan las condiciones geométricas con fsolve. Y con estas longitudes hago una simulación del movimiento y calculo el error cuadrático acumulado para esas longitudes con respecto a los valores reales que debería cumplir. Después hago la derivada con respecto a cada variable, es decir doy un incremento infinitesimal a cada variable, calculo el nuevo error y resto la diferencia entre el incremento infinitesimal. Finalmente varío la magnitud de cada variable en la dirección de decrecimiento del error dada por la derivada.
Para lograr esto he escrito un programa al que doy unos valores iniciales de las longitudes de las barras y el ángulo del acoplador de la mangueta con respecto a la rueda. A partir de estos valores calcula unos cercanos que cumplan las condiciones geométricas con fsolve. Y con estas longitudes hago una simulación del movimiento y calculo el error cuadrático acumulado para esas longitudes con respecto a los valores reales que debería cumplir. Después hago la derivada con respecto a cada variable, es decir doy un incremento infinitesimal a cada variable, calculo el nuevo error y resto la diferencia entre el incremento infinitesimal. Finalmente varío la magnitud de cada variable en la dirección de decrecimiento del error dada por la derivada.
Aquí vienen los problemas:
Para simular el movimiento defino una función con las longitudes para las cuales quiero simular, y la dejo en función de los ángulos de ambas ruedas, con fsolve resuelvo.
Problema: Para resolver con fsolve hay que definir una función y guardarla en un archivo de texto traté de resolver esto con:
Contenido
fileID = fopen('Simvar.m','w');
fprintf(fileID,'function ');
fprintf(fileID,'Simvar');
fprintf(fileID,'=');
fprintf(fileID,'Simvar');
fprintf(fileID,'(x); ');
fprintf(fileID,'L4=1000; ');
fprintf(fileID,'Simvar=');fprintf(fileID,num2str(W(3)));fprintf(fileID,'*sin(');
fprintf(fileID,'x(1)-');
fprintf(fileID,num2str(W(5)));fprintf(fileID,')+');fprintf(fileID,num2str(W(2)));fprintf(fileID,'*cos(asin(');fprintf(fileID,num2str(1/W(2)));fprintf(fileID,'*(');fprintf(fileID,num2str(W(4)));fprintf(fileID,'-');fprintf(fileID,num2str(W(3)));fprintf(fileID,'*cos(');
fprintf(fileID,'x(1)-');fprintf(fileID,num2str(W(5)));fprintf(fileID,'))))');
fprintf(fileID,'+');fprintf(fileID,num2str(W(1)));fprintf(fileID,'+');fprintf(fileID,num2str(W(2)));fprintf(fileID,'*cos(asin(');fprintf(fileID,num2str(1/W(2)));fprintf(fileID,'*(');fprintf(fileID,num2str(W(4)));fprintf(fileID,'-');fprintf(fileID,num2str(W(3)));fprintf(fileID,'*cos(');
fprintf(fileID,'x(2)');
fprintf(fileID,'+');fprintf(fileID,num2str(W(5)));fprintf(fileID,'))))');fprintf(fileID,'+');fprintf(fileID,num2str(W(3)));fprintf(fileID,'*sin(');
fprintf(fileID,'x(2)');
fprintf(fileID,'+');fprintf(fileID,num2str(W(5)));fprintf(fileID,')-L4; ');
fprintf(fileID,'end');
fclose(fileID);
x=fsolve(@Simvar,W2,options);
fprintf(fileID,'function ');
fprintf(fileID,'Simvar');
fprintf(fileID,'=');
fprintf(fileID,'Simvar');
fprintf(fileID,'(x); ');
fprintf(fileID,'L4=1000; ');
fprintf(fileID,'Simvar=');fprintf(fileID,num2str(W(3)));fprintf(fileID,'*sin(');
fprintf(fileID,'x(1)-');
fprintf(fileID,num2str(W(5)));fprintf(fileID,')+');fprintf(fileID,num2str(W(2)));fprintf(fileID,'*cos(asin(');fprintf(fileID,num2str(1/W(2)));fprintf(fileID,'*(');fprintf(fileID,num2str(W(4)));fprintf(fileID,'-');fprintf(fileID,num2str(W(3)));fprintf(fileID,'*cos(');
fprintf(fileID,'x(1)-');fprintf(fileID,num2str(W(5)));fprintf(fileID,'))))');
fprintf(fileID,'+');fprintf(fileID,num2str(W(1)));fprintf(fileID,'+');fprintf(fileID,num2str(W(2)));fprintf(fileID,'*cos(asin(');fprintf(fileID,num2str(1/W(2)));fprintf(fileID,'*(');fprintf(fileID,num2str(W(4)));fprintf(fileID,'-');fprintf(fileID,num2str(W(3)));fprintf(fileID,'*cos(');
fprintf(fileID,'x(2)');
fprintf(fileID,'+');fprintf(fileID,num2str(W(5)));fprintf(fileID,'))))');fprintf(fileID,'+');fprintf(fileID,num2str(W(3)));fprintf(fileID,'*sin(');
fprintf(fileID,'x(2)');
fprintf(fileID,'+');fprintf(fileID,num2str(W(5)));fprintf(fileID,')-L4; ');
fprintf(fileID,'end');
fclose(fileID);
x=fsolve(@Simvar,W2,options);
Pero no hay manera, aunque crea el archivo, no espera a que se haya guardado para intentar leerlo, así que da error, o lee el archivo de la ultima simulación.
He intentado meter un pause pero nada, creo que hay ciertas cosas que no actualiza hasta salir de un bucle. ¿Alguien sabe como puedo solucionar esto?
Todo esto es para el diseño de un prototipo de Formula Student. Si hay interés y el jefe no lo considera spam puedo abrir un hilo para hablar del tema.
Un saludo y perdón por el tocho!
Última edición por toñuko el 26 Jun 2014, 20:49, editado 1 vez en total
Es mi molesta opinión...