Anuncio

Colapsar
No hay ningún anuncio todavía.

Runge-Kutta

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

  • Runge-Kutta

    ¡Saludos!

    Me he puesto a trastear un poco con el método Runge-Kutta de orden 4 para resolver sistemas de ecuaciones diferenciales, y tengo problemas al simular el oscilador armónico @.@ creo que está bien programado más o menos, porque con sistemas triviales (movimiento rectilíneo uniforme, acelerado,etc) da los resultados esperados, pero con el m.a.s. me salen siempre gráficas del movimiento oscilatorio amortiguado >.< Os pego el código en C, a ver si se os ocurre algo
    Código:
    #include <stdio.h>
    #include <math.h>
    
    double f(double x, double y, double t){
          double funcion= y;          
          return funcion;
          }
    double g(double x, double y, double t){
          double gfuncion=-x;
          return gfuncion;
          }      
    int main()
    {
        FILE *xfile;
        FILE *yfile;
        FILE *sfile;
        xfile=fopen("rungekutax.txt","wt");
        yfile=fopen("rungekutay.txt","wt");
        sfile=fopen("rungekutas.txt","wt");
        double x[10000],y[10000],t[10000],h,k1,k2,k3,k4,l1,l2,l3,l4;
        int i=0;
        t[0]=0; 
        x[0]=1;
        y[0]=0;
        h=0.15;    
        while (i<500)
        {              
    
              k1=f(x[i],y[i],t[i]);
              l1=g(x[i],y[i],t[i]);
              k2=f(x[i] + 0.5*k1,y[i] + 0.5*l1,t[i] + 0.5*h);
              l2=g(x[i]+0.5*k1,y[i]+0.5*l1,t[i]+0.5*h);
              k3=f(x[i]+0.5*k2,y[i]+0.5*l2,t[i]+0.5*h);
              l3=g(x[i]+0.5*k2,y[i]+0.5*l2,t[i]+0.5*h);
              k4=f(x[i]+k3,y[i]+l3,t[i]+h);
              l4=g(x[i]+k3,y[i]+l3,t[i]+h);
              x[i+1]=x[i]+(1./6.)*(k1+2.*k2+2.*k3+k4)*h;
              y[i+1]=y[i]+(1./6.)*(l1+2.*l2+2.*l3+l4)*h;
              t[i+1]=t[i]+h;
              fprintf(xfile,"%lf\n",x[i]);
              fprintf(yfile,"%lf\n",y[i]);
              fprintf(sfile,"%lf %lf\n",x[i],y[i]);
              printf("%lf\t%lf\n",x[i],y[i]);
              i++;
              }
              fclose(xfile);
              fclose(yfile);
         
    }
    Utilizo las siguientes ecuaciones y valores iniciales:






    La función f dx/dt y g es dy/dt...no sé qué estaré haciendo mal =S gracias de antemano =)

    P.D: La siguiente web explica bastante bien cómo se aplica el método de manera práctica, por si os viene bien: http://www.scribd.com/doc/3269626/runge-kutta-sp3

    K.

  • #2
    Re: Runge-Kutta

    Parece que te has dejado unos cuantos factores h en los argumentos de las funciones. Prueba con lo siguiente:

    Código:
              k1=f(x[i],y[i],t[i]);
              l1=g(x[i],y[i],t[i]);
              k2=f(x[i] + 0.5*h*k1,y[i] + 0.5*h*l1,t[i] + 0.5*h);
              l2=g(x[i]+0.5*h*k1,y[i]+0.5*h*l1,t[i]+0.5*h);
              k3=f(x[i]+0.5*h*k2,y[i]+0.5*h*l2,t[i]+0.5*h);
              l3=g(x[i]+0.5*h*k2,y[i]+0.5*h*l2,t[i]+0.5*h);
              k4=f(x[i]+h*k3,y[i]+h*l3,t[i]+h);
              l4=g(x[i]+h*k3,y[i]+h*l3,t[i]+h);
    Mira los puntos que se obtienen comparados con el cálculo exacto (linea verde).
    Archivos adjuntos
    Última edición por pod; 15/10/2009, 03:03:38.
    La única alternativo a ser Físico era ser etéreo.
    @lwdFisica

    Comentario


    • #3
      Re: Runge-Kutta

      ¡Waaaa! ¡Muchísimas gracias, pod! Joder, es que en las fuentes que he consultado esas h's no aparecen >.< estoy volviendo a mirarlas a ver si es que se me había ido la olla pero no xD en fin, ¡gracias mil! =)

      K.

      Comentario


      • #4
        Re: Runge-Kutta

        Yo miré en la wikipedia: http://es.wikipedia.org/wiki/M%C3%A9todo_de_Runge-Kutta
        La única alternativo a ser Físico era ser etéreo.
        @lwdFisica

        Comentario


        • #5
          Re: Runge-Kutta

          Escrito por pod Ver mensaje

          Desde luego...para una vez que mi fuente no es la Wiki, y me hubiese venido bien xD bueno, gracias de nuevo =)

          K.

          Comentario


          • #6
            Re: Runge-Kutta

            ¿que programa se está usando para programar en runge kutta?....¿sirve maple?

            Comentario


            • #7
              Re: Runge-Kutta

              Escrito por alejandrito29 Ver mensaje
              ¿que programa se está usando para programar en runge kutta?....¿sirve maple?
              No conozco maple, pero me extrañaría mucho que no te sirviera.

              Por otra parte, lo que kyaloix hacia en este caso es escribir su propio programa.
              La única alternativo a ser Físico era ser etéreo.
              @lwdFisica

              Comentario


              • #8
                Re: Runge-Kutta

                Escrito por pod Ver mensaje
                Por otra parte, lo que kyaloix hacia en este caso es escribir su propio programa.
                Pero aquel programa donde se puede "hacer correr"?...me refiero a que software es compatible con el programa que el utilizó (matlab, dos, etc)...

                Comentario


                • #9
                  Re: Runge-Kutta

                  Escrito por alejandrito29 Ver mensaje
                  Pero aquel programa donde se puede "hacer correr"?...me refiero a que software es compatible con el programa que el utilizó (matlab, dos, etc)...
                  Con nada, lo ha escrito en C.
                  La única alternativo a ser Físico era ser etéreo.
                  @lwdFisica

                  Comentario

                  Contenido relacionado

                  Colapsar

                  Trabajando...
                  X