このディレクトリの索引

'LU分解は上一行とそれを除く行列の左一列から左一列を更新して、上一行と左一列を除く行列の各値を対応する上一行と左一列を使った _更新値 is _現在の値 - _対応する上一行の値 * _対応する左一列の値 で得られる更新値で書き換えます。こうして右下側の更新された矩形の行列を得ます。 この右下側の更新された矩形行列を入力として再帰的にこれを繰り返します。 最後にこの右下側の矩形の行列と上一行と左一列を結合することを繰り返して、LU分解を完成させます。'(LL,_LU分解) :- 'LU分解'(LL,_LU分解). 'LU分解'([],[]). 'LU分解'([[_左上隅|_上一行]|_第一行を除いた行列],_LU分解) :- 左一列を生成してそれと上一行と各項の現在値から上一行と左一列を除く矩形行列を生成する(_第一行を除いた行列,_左上隅,_上一行,_左一列,_更新された残り行列), 'LU分解'(_更新された残り行列,_LU分解_2), 上一行と左一列の結合([_左上隅|_上一行],_左一列,_LU分解_2,_LU分解). 左一列を生成してそれと上一行と各項の現在値から上一行と左一列を除く矩形行列を生成する(_第一行を除いた行列,_左上隅,_上一行,_更新された残り行列) :- 左一列を切り出す(_左上隅,_第一行を除いた行列,_左一列), 'LU分解_更新された残り行列(_第一行を除いた行列,_上一行,_左一列,_更新された残り行列). 左一列を切り出す(_左上隅,_第一行を除いた行列,_左一列) :- _x is 1.0 / _左上隅, findall(_値,( member([A|_],_第一行を除いた行列]), _値 is A * _x),_左一列). 'LU分解_更新された残り行列'([],_,_,_,[]) :- !. 'LU分解_更新された残り行列'([[_|_行]|_残り行列],_上一行,_左一列,[_値_1|R],[_更新された行|_更新された残り行列]) :- 'LU分解_行の更新'(_値_1,_上一行,_左一列,_行,_更新された行), 'LU分解_更新された残り行列'(_残り行列,_上一行,_左一列,R,_更新された残り行列),!. 'LU分解_更新された残り行列'(_残り行列_1,_,_,_,_残り行列) :- '左一列を除いて書き写します。'(_残り行列_1,_,_,_,_残り行列). 'LU分解_行の更新'(_,_,_,[],[]) :- !. 'LU分解_行の更新'(_,[],_,_,_) :- !, '列数分の行を生成してまだ行が残っている場合には偽で終了します。偽で終了することが残りの行を書き写すことの指示になります。'. 'LU分解_行の更新'(_,_,[],_残った列の値ならび,_残った列の値ならび) :- !. 'LU分解_行の更新'(_値_1,[_値_2|_上一行],[_|_左一列],[_現在の値|_列の値ならび],[_更新された値|_更新された列の値ならび]) :- _更新された値 is _現在の値 - _値_1 * _値_2, 'LU分解_行の更新'(_値_1,_上一行,_左一列,_列の値ならび,_更新された列の値ならび). '列数分の行を生成してまだ行が残っている場合には偽で終了します。偽で終了することが残りの行を書き写すことの指示になります。' :- fail. '左一列を除いて書き写します。'(_残り行列_1,_,_,_残り行列) :- findall(_行,member([_|_行],_残りの行列_1),_残りの行列). 上一行と左一列の結合(_上一行,_左一列,_右下の行列,[_上一行|_左一列を付加した右下行列]) :- 上一行と左一列の結合(_左一列,_右下の行列,_左一列を付加した右下行列). 上一行と左一列の結合([],[],[]). 上一行と左一列の結合([_左要素|_左要素ならび],[_行|_行ならび],[[_左要素|_行]|_残り行列]) :- 上一行と左一列の結合(_左要素ならび,_行ならび,_残り行列).