Anuncio

Colapsar
No hay ningún anuncio todavía.

Cónica en una función

Colapsar
X
 
  • Filtro
  • Hora
  • Mostrar
Borrar todo
nuevos mensajes

  • Matlab Cónica en una función

    Hola foreros,


    soy nuevo en Matlab y lo estamos utilizando en clase de Cálculo para realizar diferentes aplicaciones. En este caso, se pide que implemente una función con los parámetros de entrada A,B y C y que cuya salida sea la cónica


    Ax^2 + 2Bxy + Cy^2 = 1


    junto con el segmento que une los puntos de ella a mínima distancia del origen (el eje menor) y el segmento que une los puntos a máxima distancia (el eje mayor de la cónica).


    Si alguien pudiese arrojarme algo de luz al tema le estaría muy agradecido.


    Un saludo y gracias de antemano,


    JNE

  • #2
    Re: Cónica en una función

    Hola JNE!. Bienvenido.

    Te piden que la salida sea en ese formato?, es decir, un formato preparado como para graficar?. Sobre el eje menor y mayor, te piden que devuelvas las coordenadas del segmento de recta, o la distancia, o ambos?

    Sería algo así?

    Código:
    function [cónica para graficar, distancia eje menor, distancia eje mayor]=tufunción(A, B, C)
    
    ó         
    
    function [cónica para graficar, coordenadas eje mayor, coordenadas eje menor]=tufunción(A, B, C)
    Un abrazo.-

    Comentario


    • #3
      Re: Cónica en una función

      Hola Marce_!

      En primer lugar, gracias por tu respuesta! He preguntado esta tarde al profesor y, según he entendido, de las dos opciones que me propusiste, la que debemos usar es:

      Código:
      function [cónica para graficar, distancia eje menor, distancia eje mayor]=tufunción(A, B, C)
      ¿Habría que parametrizar la cónica para poder graficarla, verdad?

      Un saludo y muchas gracias de nuevo!

      Comentario


      • #4
        Re: Cónica en una función

        Escrito por JNE Ver mensaje
        ¿Habría que parametrizar la cónica para poder graficarla, verdad?
        No es necesario!. Hay una función de matlab (ezplot), que grafíca implicitamente. Por ahora te dejo esto, decime si te sirve y vamos bien. Te devuelve la cónica reemplazada y además te la gráfica:

        Código:
        function [c] = conicas(A,B,C)
        %Función que devuelve y grafíca cónicas dados sus coeficientes.
        
        
        f = ['A*x^2+2*B*x*y+C*y^2-1']; %Cónica implícita genérica en formato string.
        c = subs(f,{'A','B','C'},{A,B,C});% Substituyo los coeficientes por los que me dan.
        ezplot(c);
        
        
        end
        Dos ejemplos de llamada:
        Código:
        >> c=conicas(4,5,2)
         
        c =
         
        4*x^2 + 10*x*y + 2*y^2 - 1
         
        >> c=conicas(2,3,4)
         
        c =
         
        2*x^2 + 6*x*y + 4*y^2 - 1

        Un abrazo!.-

        Comentario


        • #5
          Re: Cónica en una función

          Va todo perfecto, Marce_. [FONT=Times New Roman]No sabía que ezplot se utilizase de esa manera! [/FONT]

          En cuanto a la distancia al eje menor y mayor no se me ocurre cómo calcular y representar gráficamente en el mismo segmento. He pensado en crear una variable que recorra el vector hasta encontrar los dos puntos mínimos y los dos puntos máximos. Posteriormente (no se me ocurre cómo hacerlo) los uniría y representaría.

          Gracias por tu ayuda, me estas aclarando muchas de las dudas que tenía sobre Matlab!

          Un abrazo!

          Comentario


          • #6
            Re: Cónica en una función

            Lo que tenés que tratar de hacer es de dividir lo que es la parte operativa propiamente dicha de la parte gráfica (el famoso "Divide y conquistaras"). En este caso, graficar es lo último (y hasta se podría hacer otra función que te permita graficar separada de toda la parte operativa para limpiar el código.

            No me olvide del ejercicio, lo que pasa es que estoy muy corto de tiempo (y tengo que desempolvar mi querido Algebra Lineal de Grossman porque tengo muy olvidadas las formas cónicas). Sobre lo de representar segmentos teniendo dos puntos (dos vectores), te dejo para que juegues un rato con el comando line:

            Código:
            line([0,0],[0,2],'linewidth',1,'color','r') %Segmento de recta que pasa por el punto (x=0, y=0), (x=0, y=2), grosor "1" y color rojo.
            Sobre los comandos, no te olvides del help de matlab/octave. Con solo teclear:

            Código:
            help line
            o incluso cuando uno está muy desesperado (lo he hecho)

            Código:
            help help
            Un abrazo!.-

            - - - Actualizado - - -

            Bueno, ya habiendo relojeado un poco el Grossman, te traigo algo para que lo trabajes y veas si te sirve. En el caso de las parábolas, no devolví nada, ya que no se si quieren que devuelvas la distancia del foco a la directriz.

            Todo lo que está hecho se puede hacer de mil maneras diferentes y mejores. Te añadí una nueva función (graficaconicas), que se dedica únicamente a eso y la separé justamente por el motivo que te comentaba antes (graficar a veces ensucia mucho el código). Demás está decir que no es infalible a errores, debe tener muchos, pero probé al menos 6 ejemplos en donde funciona correctamente.

            Código:
            function [f, Dmin, Dmax] = conicas(A,B,C)
            %función que devuelve la gráfica de una cónica y la distancia de sus ejes.
            
            
            M=[A,B/2;B/2,C]; %Matriz cuadrada (2x2) de coeficientes.
            [Avec,Aval]=eig(M); %Autovalores y autovectores
            
            
                if(Aval(1,1)~=0 && Aval(2,2)~=0) %Como trabajamos con matrices de 2x2, en vez de mirar el determinante, me puse a analizar los autovalores directamente.
                     if (Aval(1,1)>0 && Aval(2,2)>0)
                            if(Aval(1,1)==Aval(2,2))
                                tipo='<<<Circunferencia>>>';
                                a=(sqrt(1/Aval(1,1)));
                                b=a;
                            else
                                tipo='<<<Elipse>>>';
                                    if(Aval(1,1)>Aval(2,2))
                                        a=sqrt(1/Aval(1,1));
                                        b=sqrt(1/Aval(2,2));
                                    else
                                        a=sqrt(1/Aval(2,2));
                                        b=sqrt(1/Aval(1,1));
                  
                                    end
                            end
                    else
                        if(Aval(1,1)<0 && Aval(2,2)<0)
                            tipo='<<<Cónica degenerada>>>';
                            a=0;
                            b=0;
                        else
                            tipo='<<<Hipérbola>>>';
                            if(Aval(1,1)<0)
                                b=sqrt(1/-Aval(1,1));
                                a=sqrt(1/Aval(2,2));
                            else
                                a=sqrt(1/Aval(1,1));
                                b=sqrt(1/-Aval(2,2));
            
            
                            end
                        end
                     end
                else
                    tipo='<<<Parábola>>>';
                    a=0;
                    b=0;
                    %Acá devuelvo cero para ambas variables. Podés devolver la distancia del foco a la directriz si querés.
                end
                
            disp(tipo) %Muestro en pantalla el tipo de cónica generada.
            f=graficaconicas(tipo, Avec, Aval, A,B,C); %Me voy a la función que solo se dedica a graficar. 
            Dmin=2*a;
            Dmax=2*b;
            
            
            
            
            end
            Y "graficaconicas" es muy parecida a la anterior:

            Código:
            function [c] = graficaconicas(tipo, Avec, Aval, A,B,C)
            %Función que grafíca cónicas.
            
            
            f = ['A*x^2+2*B*x*y+C*y^2-1']; %Cónica implicita genérica en formato string.
            c = subs(f,{'A','B','C'},{A,B,C});% Substituyo los coeficientes por los que me dan.
            x=-2:0.1:2; %Rango aleatorio sobre las x que quiero graficar.
                switch tipo
                        case {'<<<Elipse>>>','<<<Circunferencia>>>','<<<Hipérbola>>>'}
                            ezplot(c);
                            hold on %Le dice al gráfico que espere, que quiero seguir graficando en la misma figura.
                            grid on %Activo la grilla del gráfico
                            m1=Avec(1,2)/Avec(1,1); %Pendiente de la recta directora con ejes rotados.
                            y=m1*x;
                            plot(x,y,'color','r','linewidth',1,'linestyle','--')
                            hold on
                            m2=Avec(2,2)/Avec(2,1); %pendiente de la otra recta (perpendicular a la primera).
                            y=m2*x;
                            plot(x,y,'color','r','linewidth',1,'linestyle','--')
                            
                        case '<<<Parábola>>>'
                            ezplot(c);
                            grid on
                            %en caso de ser una parábola, no especifiqué nada más que su gráfica (lo podés cambiar a tu gusto)
                end         
                         
            
            
            end
            Unos ejemplos:

            Código:
            [f,Dmin,Dmax]=conicas(-8,2,8)
            <<<Hipérbola>>>
             
            f =
             
            - 8*x^2 + 4*x*y + 8*y^2 - 1
             
            
            
            Dmin =
            
            
                0.6965
            
            
            
            
            Dmax =
            
            
                0.6965
            
            >> [f,Dmin,Dmax]=conicas(1,0,1)
            <<<Circunferencia>>>
             
            f =
             
            x^2 + y^2 - 1
             
            
            
            Dmin =
            
            
                 2
            
            
            
            
            Dmax =
            
            
                 2
            
            >> [f,Dmin,Dmax]=conicas(1,1,8)
            <<<Elipse>>>
             
            f =
             
            x^2 + 2*x*y + 8*y^2 - 1
             
            
            
            Dmin =
            
            
                0.7010
            
            
            
            
            Dmax =
            
            
                2.1567
            
            >> [f,Dmin,Dmax]=conicas(0,0,8)
            <<<Parábola>>>
             
            f =
             
            8*y^2 - 1
             
            
            
            Dmin =
            
            
                 0
            
            
            
            
            Dmax =
            
            
                 0
            
            >> [f,Dmin,Dmax]=conicas(-8,-0,-1)
            <<<Cónica degenerada>>>
             
            f =
             
            - 8*x^2 - y^2 - 1
             
            
            
            Dmin =
            
            
                 0
            
            
            
            
            Dmax =
            
            
                 0
            
            
            >>
            Cualquier cosa que no entiendas o no funcione, avisame.

            Un abrazo!.-

            PD: Corrección hecha en la matriz de coeficientes (es B/2).-
            Última edición por Marce_; 09/05/2014, 05:45:08. Motivo: corregir código.

            Comentario


            • #7
              Re: Cónica en una función

              Muchas gracias de nuevo, Marce_!

              Hice unas pequeñas variaciones y ya lo entregué. Ahora a esperar la corrección y ya te contaré cuál ha sido el resultado de ese apartado!

              Un abrazo!

              Comentario


              • #8
                Re: Cónica en una función

                Me alegro mucho que te haya sido útil. Me olvidé de avisarte en la última actualización que hice que hacía un poco de ruido con ciertas hipérbolas (y no recuerdo cuales en este momento). Espero que te hayas dado cuenta de ese detalle.

                Escrito por JNE
                Ahora a esperar la corrección y ya te contaré cuál ha sido el resultado de ese apartado!
                Lo importante es que lo entiendas, las calificaciones son como el dinero (van y vienen). Igual no te voy a negar que me intriga. Si querés, podés y te acordás, me podés enviar un mensaje de perfil contándome como te fué y de paso no convertimos este hilo en una sala de chat.

                Te mando un abrazo!

                Marcelo.-
                Última edición por Marce_; 14/05/2014, 00:55:08.

                Comentario

                Contenido relacionado

                Colapsar

                Trabajando...
                X