Реализовал и опробовал для одного уравнения. А для системы уравнений он у меня не те числа выдаёт, что приводятся в примере :(
Мне требуется посчитать значения этой системы уравнений:
При начальных условиях:
Скорее всего, я именно начальные условия неправильно задаю. Посмотрите пожалуйста.. как-то иначе задавать их тут нужно?
Ниже я привожу свой код, реализующий это. Думаю, тут ошибку заметят и люди не понимающие в си-шном коде, поскольку он интуитивно понятен.. Ошибка именно в математике. Сомневаюсь, что в алгоритме :)
Код:
double myF( unsigned int n, double x1, double x2 ){
double result = 0;
if ( n == 0 ) {
result = x2;
} else if ( n == 1 ) {
result = -0.2 * x2 - 10 * sin( x1 );
}
return result;
}
void RungeKutt() {
unsigned int i;
double x0, x1, x2[ 2 ], x2_t[ 2 ], k1[ 2 ], k2[ 2 ], k3[ 2 ], k4[ 2 ];
double h = 0.1;
x0 = 0.0;
x1 = 0.0;
x2[ 0 ] = 0.3;
for( i = 0; i < 4; i++ ){
x1 = x0 + i*h;
for( unsigned int n = 0; n < 2; n++ ){
k1[ n ] = h * myF( n, x1, x2[ n ] );
k2[ n ] = h * myF( n, x1 + ( h / 2 ), x2[ n ] + ( k1[ n ] / 2 ) );
k3[ n ] = h * myF( n, x1 + ( h / 2 ), x2[ n ] + ( k2[ n ] / 2 ) );
k4[ n ] = h * myF( n, x1 + ( h / 2 ), x2[ n ] + k3[ n ] );
x2_t[ n ] = ( k1[ n ] + 2 * k2[ n ] + 2 * k3[ n ] + k4[ n ] ) / 6;
printf( "%i: x1=%f, x2=%f, k1=%f, k2=%f, k3=%f, k4=%f, delta_x2=%f\n", n, x1, x2[ n ], k1[ n ], k2[ n ], k3[ n ], k4[ n ], x2_t[ n ] );
x2[ n ] = x2[ n ] + x2_t[ n ];
}
}
}