Aplicaciones y herramientas informáticas, internet y otros sucedáneos informáticos
Avatar de Usuario
por
#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:

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.


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);


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
por
#340825
No sé si te he entendido bien, y tengo poco tiempo ahora para probar el programa que has escrito, pero: ¿has probado a hacerlo con el editor?
Avatar de Usuario
por
#340827
Si, si, con el editor está hecho. El código que he puesto es solo el que crea un archivo .m con la función a estudiar. El problema es que tengo que modificar muchas veces ese archivo muy rápido (cada vez que cambian las variables) y creo que, o no guarda el archivo lo suficientemente rápido antes de intentar leerlo, o no detecta que ha cambiado mientras está dentro de un bucle.

Por ejemplo para hacer un plot dentro de un bucle hay que escribir drawnow (o algo así) no sé si necesitaré algo parecido para esto.
por
#340829
La verdad es que no creo que te pueda ayudar. A ver si el fin de semana le puedo pegar un vistazo y al menos correr el código que has puesto, para al menos comparar el efecto. Si saco algo en claro te lo digo, pero ya te aviso de que aún soy un paquete con Matlab porque tengo poco bagaje.
Avatar de Usuario
por
#340831
Te puedo enviar el código completo si quieres, otra forma de hacerlo sería poder ejecutar fsolve sin tener que leer la función de un archivo, pero no he sido capaz de hacerlo todavía.
Avatar de Usuario
por
#341068
Bueno, no he conseguido que lo haga automáticamente pero he conseguido organizar el código para que funcione todo, aunque hay que hacer unos cuantos cientos de clicks en "Run", después el programa se ejecuta iterando y acaba llegando a la solución, por fin, después de muuuchos meses peleándome con esto, nuestro fórmula va a tener sistema de dirección :)

Si de todos modos alguien me puede decir cómo indicar a matlab que actualice todas las variables y el espacio de trabajo antes de ejecutarla siguiente instrucción se lo agradecería
Palabras clave
Temas similares

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

Permisos de mensaje

No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro
No puede enviar adjuntos en este Foro