solve_lorenz_eqs.c

/*------------------------------------------------------------------------

ローレンツ方程式とヤコビ行列(線形化したローレンツ方程式)

Lorenz equations and the Jacobian (linearized Lorenz equations)

solve_lorenz_eqs.c

------------------------------------------------------------------------*/


#include "lorenz_lyap.h"


/*------------------------------------------------------------------------

ローレンツ方程式とヤコビ行列(線形化したローレンツ方程式)

Lorenz equations and the Jacobian (linearized Lorenz equations)


solve_lorenz_eqs.c

------------------------------------------------------------------------*/

void lorenz_eqs( double v[DIM], double Q[DIM][DIM], double dvdt[DIM], double dfQ[DIM][DIM] )

{

int i;

int j;

int k;

double d2;

double xx;

double yy;

double zz;

double df[DIM][DIM];


xx = v[0];

yy = v[1];

zz = v[2];

/*------------------------------------------------------------------*/

// ローレンツ方程式

// Lorenz equations

dvdt[0] = SIGMA * (yy - xx);

dvdt[1] = -xx * zz + RR * xx - yy;

dvdt[2] = xx * yy - B * zz;

/*------------------------------------------------------------------*/

// ヤコビ行列

// Jacobian matrix

df[0][0] = -SIGMA;

df[0][1] = SIGMA;

df[0][2] = 0.0;


df[1][0] = RR - zz;

df[1][1] = -1.0;

df[1][2] = -xx;


df[2][0] = yy;

df[2][1] = xx;

df[2][2] = -B;


/*

| df[0][0] df[0][1] df[0][2]

df = | df[1][0] df[1][1] df[1][2]

| df[2][0] df[2][1] df[2][2]

*/


// ヤコビ行列を用いて微小変位ベクトルを計算

// calculate the micro-displacement vectors using the Jacobian matrix

for ( i = 0; i < DIM; i++ ) {

for ( j = 0; j < DIM; j++ ) {

d2 = 0.0;

for ( k = 0; k < DIM; k++ ) {

d2 += df[i][k] * Q[k][j];

}

dfQ[i][j] = d2;

}

}

}


/*-----------------------------------------------------------------------------------------*/


void solve_lorenz_eqs_using_RK4( double v[DIM], double dfQ[DIM][DIM], double Q[DIM][DIM] )

{

int i;

int j;


double vv[DIM];

double v_k1[DIM], v_k2[DIM], v_k3[DIM], v_k4[DIM];

double df_k1[DIM][DIM], df_k2[DIM][DIM], df_k3[DIM][DIM], df_k4[DIM][DIM];

/*******************************************************/

for (i = 0; i < DIM; i++) {

vv[i] = v[i];

}

for (i = 0; i < DIM; i++) {

for (j = 0; j < DIM; j++) {

dfQ[i][j] = Q[i][j];

}

}

/*******************************************************/

// vvとdfuを渡し、v_k1とdf_k1の計算値を得る。

// pass vv and dfu, and get the calculated values of v_k1 and df_k1

lorenz_eqs( vv, dfQ, v_k1, df_k1 );


for (i = 0; i < DIM; i++) {

vv[i] = v[i] + DELTA_T * v_k1[i]/(double)2.0;

}


for (i = 0; i < DIM; i++) {

for (j = 0; j < DIM; j++) {

dfQ[i][j] = Q[i][j] + DELTA_T * df_k1[i][j]/(double)2.0;

}

}

/*******************************************************/

lorenz_eqs( vv, dfQ, v_k2, df_k2 );


for (i = 0; i < DIM; i++) {

vv[i] = v[i] + DELTA_T * v_k2[i]/(double)2.0;

}


for (i = 0; i < DIM; i++) {

for (j = 0; j < DIM; j++) {

dfQ[i][j] = Q[i][j] + DELTA_T * df_k2[i][j]/(double)2.0;

}

}

/*******************************************************/

lorenz_eqs( vv, dfQ, v_k3, df_k3 );


for (i = 0; i < DIM; i++) {

vv[i] = v[i] + DELTA_T * v_k3[i];

}


for (i = 0; i < DIM; i++) {

for (j = 0; j < DIM; j++) {

dfQ[i][j] = Q[i][j] + DELTA_T * df_k3[i][j];

}

}

/*******************************************************/

lorenz_eqs( vv, dfQ, v_k4, df_k4 );


for (i = 0; i < DIM; i++) {

v[i] += DELTA_T * (v_k1[i] + 2.0 * v_k2[i] + 2.0 * v_k3[i] + v_k4[i])/(double)6.0;

}


for (i = 0; i < DIM; i++) {

for (j = 0; j < DIM; j++) {

dfQ[i][j] = Q[i][j] + DELTA_T * (df_k1[i][j] + 2.0 * df_k2[i][j] + 2.0 * df_k3[i][j] + df_k4[i][j])/(double)6.0;

}

}

/*******************************************************/

}