このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1339338438/822
#  Cプログラミングの勉強をしているのですが、どうしてもこの問題がわかりません。  
#  分かる方がいらっしゃったら教えてください。  
#  微分方程式 y’=xyを,初期条件x=1,y=1で解くプログラムは?  
#  1)解析解は?x=0から2の範囲で刻み0.01  
#  2)オイラー法,初期条件x=0, y=1,刻み0.01  
#  3)オイラー法,初期条件を変更x=0,y=1,刻みを0.05へ変更すると  
#  4)1), 2), 3)をファイルへ出力,エクセルで比較し考察せよ  
#  5)ルンゲクッタ法(x=0,y=1,h=0.01)のデータを追加し,オイラー法との精度について考察せよ。  
#   

f(_x,_y,_z) :-
        _z is _x * _y.

オイラー法を用いて常微分方程式の解を数値的に求める(_xの初期値,_yの初期値,_xの最終値,_分割数,_y) :-
        _刻み is (_xの最終値 - _xの初期値) / _分割数,
        オイラー法を用いて常微分方程式の解を数値的に求める(0,_分割数,_xの初期値,_yの初期値,_刻み,_y).


オイラー法を用いて常微分方程式の解を数値的に求める(_分割数,_分割数,_,_y,_,_y) :- !.
オイラー法を用いて常微分方程式の解を数値的に求める(_i,_分割数,_xの初期値,_y_1,_刻み,_y) :-
        _x is _xの初期値 + _i * _刻み,
        オイラー法(_x,_y_1,_刻み,_y_2),
        i_2 is i + 1,
        オイラー法を用いて常微分方程式の解を数値的に求める(_i_2,_分割数,_xの初期値,_y_2,_刻み,_y).

オイラー法(_x,_y_1,_刻み,_y_2) :-
        f(_x,_y_1,_z),
        _y_2 is _y_1 + _z * _刻み.


'ルンゲ・クッタ法を用いて常微分方程式の解を数値的に求める'(_xの初期値,_yの初期値,_xの最終値,_分割数,_y) :-
        _刻み is (_xの最終値 - _xの初期値) / _分割数,
        'ルンゲ・クッタ法を用いて常微分方程式の解を数値的に求める'(0,_分割数,_xの初期値,_yの初期値,_刻み,_y).


'ルンゲ・クッタ法を用いて常微分方程式の解を数値的に求める'(_分割数,_分割数,_,_y,_,_y) :- !.
'ルンゲ・クッタ法を用いて常微分方程式の解を数値的に求める'(_i,_分割数,_xの初期値,_y_1,_刻み,_y) :-
        _x is _xの初期値 + _i * _刻み,
        'ルンゲ・クッタ法'(_x,_y_1,_刻み,_y_2),
        i_2 is i + 1,
        'ルンゲ・クッタ法を用いて常微分方程式の解を数値的に求める'(_i_2,_分割数,_xの初期値,_y_2,_刻み,_y).

'ルンゲ・クッタ法'(_x,_y_1,_刻み,_y_2) :-
        'ルンゲ・クッタ法_0'(_x,_y_1,_刻み,_u0),
        'ルンゲ・クッタ法_1'(_x,_y_1,_刻み,_u0,_u1),
        'ルンゲ・クッタ法_2'(_x,_y_1,_刻み,_u1,_u2),
        'ルンゲ・クッタ法_3'(_x,_y_1,_刻み,_u2,_u3),
        _y is _y_1 + (_u0 + (_u1 + _u2) * 2.0 + _u3) / 6.0.

'ルンゲ・クッタ法_0'(_x,_y_1,_刻み,_u0) :-
        f(_x,_y_1,_z_1),
        _u0 is _z_1 * _刻み.

'ルンゲ・クッタ法_1'(_x,_y_1,_刻み,_u0,_u1) :-
        _x_11 is _x + _刻み * 0.5,
        _y_11 is _y_1 + _u0 * 0.5,
        f(_x_11,_y_11,_z_2),
        _u1 is _z_2 * _刻み.

'ルンゲ・クッタ法_2'(_x,_y_1,_刻み,_u1,_u2) :-
        _x_11 is _x + _刻み * 0.5,
        _y_12 is _y_1 + _u1 * 0.5,
        f(_x_11,_y_12,_z_3),
        _u2 is _z_3 * _刻み.

'ルンゲ・クッタ法_3'(_x,_y_1,_刻み,_u2,_u3) :-
        _x_13 is _x + _刻み,
        _y_13 is _y_1 + _u2,
        f(_x_13,_y_13,_z_4),
        _u3 is _z_4 * _刻み.