1

ルンゲクッタ法を使用してローレンツシステムを計算しようとしていますが、コードにエラーがある場所が見つかりません。それを実行すると、システムは静的なポイントに移動し、バタフライ(ローレンツアトラクター)を取得する必要があります。これは、ルンゲクッタ法のセクションの「for」ループにあるものだと思います。これが私のコードです

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
double f(int,double,double []);
double s,r,b;
FILE *output;
int main()
{
    output=fopen("lorenzdata.dat","w");
    int j,N=3;
    double x[2],dt,y[2],K1[2],K2[2],K3[2],K4[2],ti,t,i;
    printf("\n Introduce parameters s, r and b sepparated by a space:");
    scanf("%lf %lf %lf",&s,&r,&b);
    printf("\n Introduce initial conditions t0,x0,y0 and z0:");
    scanf("%lf %lf %lf %lf",&ti,&x[0],&x[1],&x[2]);
    printf("\n Introduce time step:");
    scanf("%lf",&dt);
    printf("\n Specify time to compute in the equations:");
    scanf("%lf",&t);
/* Loop para Runge Kutta 4 */
    do
    {
      /*  printf("%9.4f %9.4f %9.4f %9.4f \n",ti,x[0],x[1],x[2]); */
        i++;
        for(j=0;j<N;j++)
        {
            K1[j] = f(j,ti,x);
        }
        for(j=0;j<N;j++)
        {
            y[j] = x[j]+(K1[j]/2)*dt;
        }
        for(j=0;j<N;j++)
        {
            K2[j] = f(j,ti+dt/2,y);
        }
        for(j=0;j<N;j++)
        {
            y[j] = x[j]+(K2[j]/2)*dt;
        }
        for(j=0;j<N;j++)
        {
            K3[j] = f(j,ti+dt/2,y);
        }
        for(j=0;j<N;j++)
        {
            y[j] = x[j]+(K3[j])*dt;
        }
        for(j=0;j<N;j++)
        {
            K4[j] = f(j,ti+dt,y);
        }
        for(j=0;j<N;j++)
        {
            x[j] += dt*((K1[j]/6)+(K2[j]/3)+(K3[j]/3)+(K4[j]/6));
        }
        ti +=dt;
        fprintf(output,"%9.4f %9.4f %9.4f \n",x[0],x[1],x[2]);
    }while(i*dt <= t);
    fclose(output);
    return 0;
}
/* Definimos la funcion */
double f(int m,double h,double x[])
{
    if(m==0)
    {
        return s*(x[1]-x[0]);
    }
    else if(m==1)
    {
        return x[0]*(r-x[2])-x[1];
    }
    else if(m==2)
    {
        return x[0]*x[1]-b*x[2];
    }
}

前もって感謝します

編集

Linuxで(より単純化された方法で)コードを再度記述しましたが、正常に動作します。Windowsのエディターには、コードをコンパイルしたときに多くの無限の値がスローされる何か(おそらくエンコーディング)があったようです。理由がわからないので、それに気付くのにかなりの時間がかかりました。ご協力いただきありがとうございます

4

3 に答える 3

1

他の問題を無視して、変数「i」はどこで初期化されますか?

于 2012-02-18T05:51:59.183 に答える
1

次のような線

for(j=0;j<N;j++)
{
    y[j] = x[j]+(K1[j]/2)*dt;
}

間違っている。

次のようになります。

for(j=0;j<N;j++)
{
    K1[j] = f(j,ti,x[j],y[j]);
    L1[j] = g(j,ti,x[j],y[j]);
}
for(j=0;j<N;j++)
{
    K2[j] = f(j,ti+dt/2,x+k1[j]/2,y+L1[j]/2);
    L2[j] = g(j,ti+dt/2,x+k1[j]/2,y+L1[j]/2);
}
for(j=0;j<N;j++)
{
    K3[j] = f(j,ti+dt/2,x+K2[j]/2,y+L2[j]/2);
    L3[j] = g(j,ti+dt/2,x+K2[j]/2,y+L2[j]/2);
}
for(j=0;j<N;j++)
{
    K4[j] = f(j,ti+dt,x+K3[j],y+L3[j]);
    L4[j] = g(j,ti+dt,x+K3[j],y+L3[j]);
}
for(j=0;j<N;j++)
{
    x[j] += dt*((K1[j]/6)+(K2[j]/3)+(K3[j]/3)+(K4[j]/6));
    y[j] += dt*((L1[j]/6)+(L2[j]/3)+(L3[j]/3)+(L4[j]/6));
}

ルンゲクッタはこのように機能します。

連立方程式があります。

dx / dt = f(t、x、y)dy / dt = g(t、x、y)

関数の引数ごとに、ルンゲクッタ法のサブステップ(k1、k2など)が必要です。したがって、サブステップ「k」ごとに、「サブステップ」で更新されたxとyの値が必要です。2番目のサブステップx+k1/2およびy+l1/2の例として。

于 2012-02-18T06:06:52.483 に答える
1

N = 3は、x、y、およびKsの割り当てが

x [3]、y [3]、K1 [3]、..。

double x [2]、dt、y [2]、K1 [2]、K2 [2]、K3 [2]、K4 [2]、ti、t、iの代わりに;

于 2013-07-23T17:43:02.733 に答える