このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1339338438/625
#  [1] 授業単元:プログラミング 
#  [2] 問題文(含コード&リンク):http://ime.nu/www.fluid.cse.nagoya-u.ac.jp/~ishihara/c/ 
#     7/6の課題 
#  9.1 ニュートン法
#  
#  f(x)=0の解を求めるアルゴリズム.
#  
#  x=x0を初期値(近似値)として,x=x0におけるy=f(x)の接線:y-f(x0)=f'(x0)(x-x0)と
#  x軸との交点 x=x1=x0-f(x0)/f'(x0)を新しい近似値とする。
#  

反復回数上限(1000).

f(X,Y) :- Y is 2 * X * X - 7 * X + 6.

df(X,Y) :- Y is 4 * X - 7.


'f(x)=0の解を求める' :-
        数を得る(初期値x0,_初期値),
        ニュートン法(_初期値,_反復回数,_収束解),
        writef('収束解 = %t\n',[_収束解]).
'f(x)=0の解を求める' :-
        write('収束しません\n').

ニュートン法(_初期値,_反復回数,_収束解) :-
        反復回数上限(_反復回数上限),
        f(_初期値,Y1),
        df(_初期値,Y2),
        X_0 is _初期値 - Y1 / Y2,
        ニュートン法(1,_反復回数上限,X_0,Y1,_反復回数,_収束解).

ニュートン法(_反復回数,_反復回数上限,_,_,_) :- _反復回数 > _反復回数上限,!,fail.
ニュートン法(_反復回数,_,X,Y,_反復回数,X) :-
        abs(Y) < 1.0e-09.
ニュートン法(_反復回数_1,_反復回数上限,X_1,Y,_反復回数,X) :-
        f(X_1,Y1),
        df(X_1,Y2),
        X_2 is X_1 - Y1 / Y2,
        _反復回数_2 is _反復回数_1 + 1,
        ニュートン法(_反復回数_2,_反復回数上限,X_2,Y1,_反復回数,X).


数を得る(A,N) :-
writef('%w : ',[A]),
行を得る(_行),
read_term_from_atom(_行,N,[]).

行を得る(_行) :-
read_line_to_codes(user_input,Codes),
atom_codes(_行,Codes).

%  数を得る