このディレクトリの索引

以下のサイトは 'Σ'(_n_1,_n_2,_k,_目標の集約値,_目標,_集約合計) :- findsum(_目標の集約値,( between(_n_1,_n_2,_k),_目標),_集約合計). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). '最小二乗法とは、測定で得られた数値の組を、適当なモデルから想定される 1次関数 ax+b を用いて近似するときに、想定する関数が測定値に対してよい 近似となるように、残差の二乗和を最小とするような係数を決定する方法。'(_測定で得られた数値の組,_a,_b) :- length(_測定で得られた数値の組,_標本数), '測定で得られた数値の組をLx,Lyに分解する'(_測定で得られた数値の組,Lx,Ly), '適当なモデルから想定される1次関数 ax+b を用いて近似するときに、 想定する関数が測定値に対してよい近似となるように、残差の二乗和を 最小とするような係数を決定する'(_標本数,Lx,Ly,_a,_b). '測定で得られた数値の組をLx,Lyに分解する'([],[],[]). '測定で得られた数値の組をLx,Lyに分解する'([(X,Y)|R],[X|Rx],[Y|Ry]) :- '測定で得られた数値の組をLx,Lyに分解する'(R,Rx,Ry). '適当なモデルから想定される1次関数 ax+b を用いて近似するときに、 想定する関数が測定値に対してよい近似となるように、残差の二乗和を 最小とするような係数を決定する'(_標本数,Lx,Ly,_a,_b) :- 係数a(_標本数,Lx,Ly,_a), 係数b(_標本数,Lx,Ly,_b). 係数a(_標本数,Lx,Ly,_a) :- 係数aの式の分子(_標本数,Lx,Ly,_分子), 係数aの式の分母(_標本数,Lx,Ly,_分母), _a is _分子 / _分母. 係数aの式の分子(_標本数,Lx,Ly,_分子) :- 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),nth1(_k,Ly,Y),S is X * Y),_合計_1), 'Σ'(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_2), 'Σ'(1,_標本数,_k,S,nth1(_k,Ly,S),_合計_3), _分子 is _標本数 * _合計_1 - _合計_2 * _合計_3. 係数aの式の分母(_標本数,Lx,Ly,_分母) :- 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_1), 'Σ'(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_2), _分母 is _標本数 * _合計_1 - _合計_2 ^ 2. 係数b(_標本数,Lx,Ly,_b) :- 係数bの式の分子(_標本数,Lx,Ly,_分子), 係数bの式の分母(_標本数,Lx,Ly,_分母), _b is _分子 / _分母. 係数bの式の分子(_標本数,Lx,Ly,_分子) :- 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_1), 'Σ'(1,_標本数,_k,S,nth1(_k,Ly,S),_合計_2), 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),nth1(_k,Ly,Y),S is X * Y),_合計_3), 'Σ'(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_4), _分子 is _合計_1 * _合計_2 - _合計_3 * _合計_4. 係数bの式の分母(_標本数,Lx,Ly,_分母) :- 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_1), 'Σ'(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_2), _分母 is _標本数 * _合計_1 - _合計_2 ^ 2. 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/559 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9844.txt # 電流I[A]: 0.3 0.4 0.5 0.6 0.7 0.8 # 電圧V[V]: 11.6 12.3 12.8 13.4 23.7 14.8 # # この電流Iと電圧Vとの関係を最小二乗法によって、 # 以下に示す1次関数で近似したい # # V=a0+a1I # # この時の係数a0とa1 また相関係数を求めなさい。 '最小二乗法によってV=a0+aIの係数を求める'(L,A0,A1) :- i要素のみのならび(L,LI), v要素のみのならび(L,LV), a0(L,LI,LV,A0), a1(L,LI,LV,A1),!. a1(L,LI,LV,A1) :- findsum(U1,(member(I1,LI),U1 is I1 * I1),Sgm1), sum_list(LI,Sgm2), AD1 is Sgm2 * Sgm2, findsum(U2,(member([I,V],L),U2 is I * V),Sgm3), sum_list(LV,Sgm4), A1 is (Sgm3 - Sgm2 * Sgm4) / (Sgm1 - Sgm2 * Sgm2),!. a0(L,LI,LV,A0) :- findsum(U1,(member(I1,LI),U1 is I1 * I1),Sgm1), sum_list(LI,Sgm2), findsum(U2,(member([I,V],L),U2 is I * V),Sgm3), sum_list(LV,Sgm4), A0 is (Sgm1 * Sgm4 - Sgm3 * Sgm2) / (Sgm1 - Sgm2 * Sgm2). i要素のみのならび(L,LI) :- findall(I,member([I,_],L),LI). v要素のみのならび(L,LV) :- findall(V,member([_,V],L),LV). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1250204272/443 # # [1] 授業単元:統計プログラミング # [2] 問題文(含コード&リンク): # 1.適当な方程式 y = a x + b を定め、n 個の x に対してランダムな誤差を # 持つ y のサンプルデータを生成するプログラムを作成せよ。 #  出力形式は、例えば改行で区切られた1行ごとにスペース区切りで x, y の値を # 標準出力に書き出す。 #  ランダムな誤差に関しては、適当な範囲内の乱数を単純に各々の値に # 適用すればよい。 #  (本来は正規分布に従った乱数を用いる方が望ましい) # 2.前問で作成したプログラムの出力から、最小二乗法により、逆に a, b を # 求めるプログラムを作成し、 #  求めた値に関して、前問のプログラムで設定した a, b に対する考察をせよ。 # 3.以上を二次方程式(y = a x^2 + b x + c)に対して繰り返し、 # a, b, c に関して考察せよ。 t695_1(_標本座標ならび) :- findall([_X座標,_Y座標],一次関数に誤差を生じさせる(40,-20,0.5,2,3,_X座標,_Y座標),_標本座標ならび). 一次関数に誤差を生じさせる(_標本数,_初期X座標,_サンプルX座標間隔,A,B,_X座標,_Y座標) :- 乱数値とYの決定(_標本数限界,_サンプルX座標間隔,_初期X座標,_X座標,R), _誤差係数 is (1 - (R - 0.5) ^ 2), _Y座標 is ( A * _X座標 + B ) * _誤差係数. 乱数値とYの決定(_標本数限界,_サンプルX座標間隔,_初期X座標,_X座標,_乱数値) :- A is time, B is A mod 65535, 乱数値とYの決定(1,_標本数限界,_サンプルX座標間隔,_初期X座標,_X座標,16087,B,65535,Y,_乱数値). 乱数値とYの決定(K,Max,_,_,_,_,_,_,_,_) :- K > Max,!,fail. 乱数値とYの決定(K,Max,_サンプルX座標間隔,_X座標,_X座標,A,N,_法,N,_乱数値) :- _乱数値 is N / _法. 乱数値とYの決定(K,Max,_サンプルX座標間隔,_X座標1,_X座標,A,N,_法,Y,_乱数値) :- 乗算合同法演算(A,N,_法,M), _X座標2 is _X座標 + _サンプルX座標間隔, K2 is K + 1, 乱数値とYの決定(K2,Max,_サンプルX座標間隔,_X座標2,_X座標,A,M,_法,Y,_乱数値). 乗算合同法演算(A,N,_法,M) :- M is (A * N) mod _法. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/89 # # 質問テンプレ】 # [1] 授業単元:組合せ最適化 # [2] 問題文(含コード&リンク): # # 以下のアルゴリズムを実装せよ。 # Find(j) # if j=0 何もしない # else # ・e[i][j]+C+OPT(i-1)を最小にするiを計算する # ・{p[i],p[i+1],・・・・,p[j]}を出力し、Find(i-1)を実行。 # # なおFind()は関数とし、変数はすべて計算済みとする。 # # iの範囲-> 1<=i<=j を満たす。 # e[i][j]+C+OPT(i-1)の型 →型の意味がわからなくて説明の仕方がわかりません。 # pの型 →同上 # 出力形式 →printfで表示してください。 # OPT()も計算済みです。 # OPT(j)=e[i][j]+C+OPT(i-1)になります。 # e[i][j]=Σ(k=i〜j) (y[k]-a*x[k]-b)^2 # このy[k],x[k]は入力で与えられてます。 # a,bは最小二乗法で求めてあります。 # 'Find'(0). 'Find'(_j) :- findmin([X,_i],( between(1,_j,_i), 'e[i][j]+C+OPT(i-1)'(_i,_j,X)), [_,_i]), '{p[i],p[i+1],・・・・,p[j]}を出力し'(_i,_j), _j_1 is _i - 1, 'Find'(_j_1).