このディレクトリの索引

http://pc12.2ch.net/test/read.cgi/tech/1258158172/671 
#  [1] 授業単元: C言語 
#  [2] 問題文(含コード&リンク): 
#  関数としてy=sinx,y'=sinx+xcosxを取り上げ、f'(x)=sinx+xcosxの値を数値微分に 
#  りよる方法から計算するプログラムを作成し 
#  解析値と比較してみよ。ただしh=0.1とし、0≦x≦πとせよ。 
# 

f(X,Y) :- Y is sin(X).
f2(X,Y) :- Y is cos(X).

ラグランジェ法による数値微分(N,X,_数値微分値,_解析値) :-
    findall(U,(for(0,M,N),X is pai / N * M),XL),
    findall(U,(for(0,M,N),X is pai / N * M,f(X,Y)),YL),
    ラグランジェ法(XL,YL,N,X,_数値微分値),
    f2(X,_解析値),!.

ラグランジェ法(XL,YL,N,X,Diff) :-
    ラグランジェ法の一(0,N,XL,YL,XL,X,0.0,Diff).

ラグランジェ法の一(N,N,_,_,XL,X2,Diff,Diff) :- !.
ラグランジェ法の一(I,N,[X|R1],[Y|R2],XL,X2,W1,Diff) :-
    ラグランジェ法の二(0,N,I,XL,XL,X,X2,0.0,1.0,S0,S2),
    W2 is W1 + Y * S0 / S2,
    I2 is I + 1,
    ラグランジェ法の一(I2,N,R1,R2,XL,X2,W2,Diff).

ラグランジェ法の二(N,N,I,L1,XL,Xi,X2,0.0,1.0,S5,S6) :- !.
ラグランジェ法の二(J,N,I,[X|R1],XL,Xi,X2,S0,S2,S5,S6) :-
    \+(I = J),
    S3 is (Xi - X) * S2,
    ラグランジェ法の三(0,N,I,J,XL,X2,S1),
    S4 is S0 + S1,
    J2 is J + 1,
    ラグランジェ法の二(J2,N,I,R1,XL,Xi,X2,S4,S3,S5,S6).
ラグランジェ法の二(J,N,I,[X|R1],XL,Xi,X2,S0,S2,S5,S6) :-
    I = J,
    J2 is J + 1,
    ラグランジェ法の二(J2,N,I,R1,XL,Xi,X2,S0,S2,S5,S6).

ラグランジェ法の三(N,N,I,J,_,X2,1.0) :- !.
ラグランジェ法の三(K,N,I,J,[X|R1],X2,S) :-
    \+(K=I),
    \+(K=J),
    K2 is K + 1,
    ラグランジェ法の三(K2,N,I,J,R1,X2,S2,S),
    S is S2 + (X2 - X),!.
ラグランジェ法の三(K,N,I,J,[X|R1],X2,S) :-
    ( K = I; K = J),
    K2 is K + 1,
    ラグランジェ法の三(K2,N,I,J,R1,X2,S).