jueves, 31 de diciembre de 2015

Diseño de mecanismos de 4 barras en Matlab - Ejercicio

Se busca optimizar el angulo de salida de un mecanismo con respecto a una función previamente dada, de acuerdo al angulo de salida.

El mecanismo debe ser de 4 barras y se rige por las ecuaciones descritas en el libro “Diseño de maquinaria”de Robert L Norton.

El angulo de entrada tiene el siguiente rango:


Y la ecuación que buscamos que cumpla el angulo de salida es:







Graficando esto con ayuda de matlab tenemos
Lo que es esperado ya que el valor cuadrado es muy pequeño, y resulta casi que el ángulo de salida es el contrario al de la entrada.
Se procedió en matlab:


La función punto1main.m consiste en evaluar, por medio de fmincon, la función que deseamos optimizar que es punto1m4bar y punto1m4bar2 esto porque es diferente si tomamos el mecanismo como cruzado o como abierto






Ilustración 1 - Tomada de Diseño de maquinaria- Robert Norton pg 175


Las funciones consisten en comparar, a través de las formulas que permiten establecer el angulo de salida en función del angulo de entrada y la longitud de las barras con la función dada.
Se incluye una instrucción para comprobar que el mecanismo pueda ensamblarse, lo que se logra comprobando que no existen números complejos dentro de la formula.
x(4)=1;

k1=x(4)/x(1);
k2=x(4)/x(3);
k3=(x(1)^2-x(2)^2+x(3)^2+x(4)^2)/(2*x(1)*x(3));
k4=x(4)/x(2);
k5=(x(3)^2-x(4)^2-x(1)^2-x(2)^2)/(2*x(1)*x(2));

se hace un barrido a través de el angulo de entrada dado con un for,  a la vez que se comprueban los complejos, se halla el angulo de salida y se comprara con la función:
for teta=-0.349:0.001:0.349
 
A=cos(teta)-k1-(k2*cos(teta))+k3;
B=-2*sin(teta);
C=k1-((k2+1)*cos(teta))+k3;
D=cos(teta)-k1+k4*cos(teta)+k5;
E=-2*sin(teta);
F=k1+(k4-1)*cos(teta)+k5;

if (B^2-4*A*C)<=0 ||(E^2-4*D*F)<=0;
     error1acum=error1acum+1e3*abs(B^2-4*A*C);
end

teta4=2*atan( (-B -sqrt(B^2-4*A*C)) / (2*A));

funcgalea=0.2865*teta^2-teta;

error1=abs(teta4-funcgalea);

error1acum=error1acum+error1;
f=error1acum;
este error acumulado es la suma de cada error puntual para el barrido, siendo el error puntual llamado “error1” que es la diferencia absoluta puntual entre la función dada y la función aproximada por el mecanismo.
Cabe destacar el bloque if, donde se busca que la optimización se “aleje” de los números complejos utilizando convenientemente los valores absolutos de dichas raíces cuando son negativas, se toma su valor absoluto, se multiplica por 1000, y se adiciona… asegurando que el programa se aleje de este crecimiento repentino de la función. Esta restricción artificial fue necesaria ya que no es la misma para diferentes valores de las barras y ángulos, lo que dificulta la creación de una restricción desde la función punto1main.m.

Como resultados tenemos:


 



Al ejecutar el programa, obtenemos los datos de las barras:
24.5621    0.0364   23.5882
y las graficas de comparación de las funciones y el error. Nótese la gran inexactitud que se presenta.
Dicha inexactitud se presenta por las complicaciones en el rango de el angulo de entrada, que hacen que el angulo de salida sea imposible de conseguir. El movimiento necesitado es similar a dos engranajes, que resulta imposible su transporte a un mecanismo de 4 barras.
Lo mas cercano, es la construcción del mecanismo en un ángulo diferente, o en un rango sin que pasen por cero y se agarrote el mecanismo.

Ilustración 2 - yourdictionary.com




Se toman como variables la longitud de las 4 barras, la distancia y ángulo del punto de acción del mecanismo (P), y adicionalmente un ángulo y un desfase del ángulo donde se espera aproximar la distancia del punto P a una función dada.
a)      En este caso, la función dada se evaluó como un polinomio de grado 5. Fpunto2 utiliza esta función comparándola con la posición en X y en Y que surgen a partir del ángulo de entrada. Es por esto que el ángulo de entrada tuvo que ser definido como un rango especificado por x(7) y x(8).
Para aproximar la función entonces, se comparo el valor del polinomio con el valor dado por el mecanismo. A esto se le saca valor absoluto y se suma a lo largo del barrido angular.
px=x(1)*cos(teta)+x(5)*cos(teta3+x(6));
    py=x(1)*sin(teta)+x(5)*sin(teta3+x(6));
    py2=polyval(p,px);
    f2=abs(py2-py);
    f=f+f2 ;

adicionalmente, se comprueba si hay números complejos lo que impedirían el ensamble del mecanismo
if (B^2-4*A*C)<=0 ||(E^2-4*D*F)<=0 ;
           error=1;
         end

cuando error=1,
if error==1
    f=1e6;
end
   

lo que asegura que el programa seguirá iterando alejándose de los valores complejos.
Adicionalmente a través del contador “iter” se trazó la convergencia definida como la función que estamos minimizando para cada iteración





Se destacan los valores de 10^6 que son cuando se crearon números complejos y el programa abandona dicha ruta de optimización.
Nuevamente a través de “mecanismo4barras.m” se grafica el mecanismo girando en el rango angular que fue optimizado, en la posición cruzada y abierta




En Excel, solver fue incapaz de hallar una solución a pesar de multiples métodos para corregir las raíces de números negativos y de utilizar posibles barridos angulares dada la misma dificultad de encontrar los pares de números, en 5 ocasiones distintas




En gris: barras
En gris a la derecha: ayuda para evitar raíces negativas,

en verde: celda objetivo




 

fue posible establecer el error como la diferencia entre la posición X del mecanismo y 20, con resultados optimos
px=x(1)*cos(teta)+x(5)*cos(teta3+x(6));

f2=abs(px-20);
f=f+f2;

de esta manera el error fue fácil de optimizar en el rango dado, que es escogido también por la maquina, o por las condiciones de frontera establecidas