Anuncio

Colapsar
No hay ningún anuncio todavía.

mínimos cuadrados en matlab

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

  • Matlab mínimos cuadrados en matlab

    Hola

    os pido ayuda,tengo que hacer este ejercicio, he estado mirando manuales pero no se ni por donde empezar,en mathematica me manejaba bien pero matlab me esta pareciendo muy muy difícil

    Toma 50 puntos de datos igualmente separados entre el intervalo y calcula esta función en dichos puntos.


    Muchas gracias

  • #2
    Re: mínimos cuadrados en matlab

    esta claro que me equivoque en el titulo del hilo
    Última edición por Mister Kroket; 24/04/2012, 13:48:45.

    Comentario


    • #3
      Re: mínimos cuadrados en matlab

      Hola Mister Kroket,

      Sí, la verdad es que el título del hilo no tiene mucho que ver con lo que preguntas

      Escrito por Mister Kroket
      Toma 50 puntos de datos igualmente separados entre el intervalo y calcula esta función en dichos puntos.
      Hay varias maneras de hacer la segunda parte...En cuanto a la primera, no tienes más que utilizar un comando que te permite generar un vector fila de puntos, entre y . Tienes que escribir:

      Código:
      >> a=linspace(0,5,50)
      Te generará un vector fila tal que así:

      a =

      Columns 1 through 6

      0 0.1020 0.2041 0.3061 0.4082 0.5102

      Columns 7 through 12

      0.6122 0.7143 0.8163 0.9184 1.0204 1.1224

      Columns 13 through 18

      1.2245 1.3265 1.4286 1.5306 1.6327 1.7347

      Columns 19 through 24

      1.8367 1.9388 2.0408 2.1429 2.2449 2.3469

      Columns 25 through 30

      2.4490 2.5510 2.6531 2.7551 2.8571 2.9592

      Columns 31 through 36

      3.0612 3.1633 3.2653 3.3673 3.4694 3.5714

      Columns 37 through 42

      3.6735 3.7755 3.8776 3.9796 4.0816 4.1837

      Columns 43 through 48

      4.2857 4.3878 4.4898 4.5918 4.6939 4.7959

      Columns 49 through 50

      4.8980 5.0000
      Para la segunda parte, lo más útil es utilizar la denominadas variables de función. Puedes hacerlo con un fichero.m o lo mejor, utilizando funciones inline. Yo lo haré así, pero si te interesa hacerlo de otro modo y no sabes pregunta.

      Lo bueno de las funciones inline es que se pueden definir diréctamente en la línea de comandos. En nuestro caso excribiríamos:

      Código:
      >> mi_funcion=inline('5+2.*x.*sin(x)+4.*exp(-x)')
      Te aparecerá ésto:

      mi_funcion =

      Inline function:
      mi_funcion(x) = 5+2.*x.*sin(x)+4.*exp(-x)
      Por último, tienes que evaluar la función en los puntos que quieres mediante el comando feval. Ojo, que si has definido tu función con un fichero.m tienes que llamar a la función como una cadena de texto (entre comillas). Como lo hemos hecho mediante inline, lo hacemos como una variable cualquiera:


      Código:
      >> feval(mi_funcion,a)
      ans =

      Columns 1 through 5

      9.0000 8.6328 8.3443 8.1297 7.9835

      Columns 6 through 10

      7.8998 7.8723 7.8940 7.9578 8.0562

      Columns 11 through 15

      8.1812 8.3249 8.4792 8.6359 8.7869

      Columns 16 through 20

      8.9244 9.0407 9.1287 9.1817 9.1935

      Columns 21 through 25

      9.1587 9.0726 8.9315 8.7323 8.4731

      Columns 26 through 30

      8.1530 7.7721 7.3314 6.8333 6.2810

      Columns 31 through 35

      5.6788 5.0320 4.3469 3.6304 2.8906

      Columns 36 through 40

      2.1359 1.3755 0.6192 -0.1232 -0.8413

      Columns 41 through 45

      -1.5250 -2.1639 -2.7479 -3.2674 -3.7132

      Columns 46 through 50

      -4.0765 -4.3495 -4.5253 -4.5979 -4.5623
      Ya luego puedes representarla, y hacer lo que quieras con ella. Ese sería el resultado, si no me he colado en meter la función. Espero que te sirva.

      Saludos,
      ''No problem is too small or too trivial if we can really do something about it''
      Richard Feynman

      Comentario


      • #4
        Re: mínimos cuadrados en matlab

        muchas gracias por la ayuda, con tu permiso voy a hacer algunas algunas preguntas más, en realidad el ejercicio era más largo ( y ahora entenderás porque puse el titulo que le puse al post )pero como no sabía por donde empezar puse solo esa duda, al parecer tengo que añadir tambien una desviación aleatoria [-0.5,0.5] a los valores de y, que no se a que se refiere ni como hacerlo he buscado en google ( random deviation matlab ) pero nada, y también hacer un ajuste por mínimos cuadrados a los datos (y), usando las funciones { 1, x.*sin(x), exp (-x) } y la operación backlash (\) de Matlab he visto que hay comandos para hacer el ajuste , pero no entiendo porque tengo que usar esas funciones , un ajuste de mínimos cuadrados de toda la vida solo necesita pares de puntos ( x, y) no?

        gracias

        Comentario


        • #5
          Re: mínimos cuadrados en matlab

          Hola de nuevo,

          Sí, ya veo por dónde va el ejercicio. Es bastante típico lo de sumar una ''desviación aleatoria'' a una función que has definido. No es más que sumarle un ''ruido'' como el que aparecería en una serie de datos experimentales que has tomado en un laboratorio. Se hace de la siguiente manera: en primer lugar, creas tu vector con los puntos , que retomando tu ejemplo sería:

          Código:
          x=linspace(0,5,50)
          Posteriormente, calcularías los valores de la función definiéndola diréctamente en la línea de comandos. Es perfectamente válido lo que hemos hecho antes, pero claro, viendo el ejercicio completo, es más rápido tomar este camino:

          Código:
          y=5+2.*x.*sin(x)+4.*exp(-x)
          Ahora, hay que sumarle el ruido, que es lo que te interesa. No sé muy bien, si lo que te dan hace referencia a que el ruido está dado por valores aleatorios que se distribuyen uniformemente en ese intervalo. En ese caso, puedes definir el ruido como:

          Código:
          ruido=-0.5+rand(size(y))
          Supongo que sabrás, que para generar números aleatorios que se distribuyen en un intervalo [a, b] utilizas:

          Código:
          r=a+(b-a).*rand(m,n)
          Por tanto, tienes que redefinir tu función, llamémosla ''experimental'' para no liarnos:

          Código:
          fun_experimental=f+ruido
          Por último, para serte sincero, nunca había visto un ajuste por mínimos cuadrados de esa forma. No he usado nunca el comando ese, y no sé para qué te dan esas funciones...ya que lo más sencillo es utilizar el comando polyfit. Investigaré sobre el tema, pero ya te digo que eso es lo más sencillo.

          Tienes otras opciones como utilizar el interfaz de Matlab para el ajuste de datos, tools- basic fitting, o hacerte un programita para calcularte el polinomio.

          Te dejo el mío. Siempre me ha funcionado realmente bien, pero si se te ocurre algo óptimo ( o no entiendes algo), ya me dices:

          Código:
          function p=minimos_cuadrados(x,f,n,w)
          %La función minimimos_cuadrados calcula los coeficientes de un polinomio
          % de grado n por mínimos cuadrados partiendo de los datos que se introducen
          % en las variables de entrada x e f. Además, con peso w,que si no se
          % especifica toma valor w=1. 
          if nargin<4
              w=x-x+1; % Si el número de variables de entrada es menor que cuatro, se
              % toma por defecto peso igual a 1. 
          end
          m=size(x,1)+size(x,2)-1;
          if m>=n+1 % Es decir, si hay suficientes datos.
              for j=1:2*n+1
                  s(j)=0; %Crear el vector s.
                  for i=1:m
                      s(j)=s(j)+w(i)*x(i)^(j-1);
                  end
              end
          end
              for j=1:n+1
                      c(j)=0; %Crear el vector c.
                      for i=1:m
                          c(j)=c(j)+w(i)*f(i)*x(i)^(j-1);
                      end
              end
              for i=1:n+1 %Crear la matriz del sistema.
                  for j=1:n+1
                      M(i,j)=s((i-1)+j);
                  end
              end
              size(M);
              p=M\c'; %Resolver el sistema.
          Saludos,
          ''No problem is too small or too trivial if we can really do something about it''
          Richard Feynman

          Comentario


          • #6
            Re: mínimos cuadrados en matlab

            Muchisimas gracias Cat_in_a_Box

            Comentario

            Contenido relacionado

            Colapsar

            Trabajando...
            X