このディレクトリの索引

% 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/990 # お題:円周率の歴史の長さからみれば出来立てほやほやのBBPの式を使って # 円周率を小数点以下15桁まで求める。 #   ∞ # π=Σ(4/(8*k+1)-1/(4*k+2)-1/(8*k+5)-1/(8*k+6))/(16^k) #   k=0 # # '円周率の歴史の長さからみれば出来立てほやほやのBBPの式を使って円周率を小数点以下15桁まで求める。'(_円周率) :- 'BBPの式'(_円周率_1), sformat(S,'~15f',[_円周率_1]), read_term_from_atom(S,_円周率,[]). 'BBPの式'(_円周率) :- findsum(A,( between(0,20,_k), A is (4/(8*_k+1)-1/(4*_k+2)-1/(8*_k+5)-1/(8*_k+6))/(16^_k)), _円周率). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). % 以下のサイトは 格子点法によって円周率を近似する(_格子点の数,_円周率) :- '格子点の原点からの距離が1未満の度数を得る(X軸が0或いはY軸が0の時はこの軸の格子点の半数は度数に計上しない)'(_格子点の数,_原点からの距離が1未満の格子点の度数), この格子点度数は4分の1の円でのものだから円周率はこの度数を格子点数で割った商を4倍する(_格子点の数,_原点からの距離が1未満の格子点の度数,_円周率). '格子点の原点からの距離が1未満の度数を得る(X軸が0或いはY軸が0の時はこの軸の格子点の半数は度数に計上しない)'(_格子点の数,_原点からの距離が1未満の格子点の数) :- 度数('格子点の座標は原点からの距離が1未満(X軸が0或いはY軸が0の時はこの軸の格子点の半数は度数に計上しない)'(_格子点の数),_原点からの距離が1未満の格子点の数). '格子点の座標は原点からの距離が1未満(X軸が0或いはY軸が0の時はこの軸の格子点の半数は度数に計上しない)'(_格子点の数) :- '格子点の座標は(X軸が0或いはY軸が0の時はこの軸の格子点の半数は度数に計上しない)'(_格子点の数,X,Y), '原点からの距離が1未満'(_格子点の数,X,Y). '格子点の座標は(X軸が0或いはY軸が0の時はこの軸の格子点の半数は度数に計上しない)'(_格子点の数,X,Y) :- _平行線の数 is truncate(sqrt(_格子点の数)), between(0,_平行線の数,X), between(1,_平行線の数,Y). '原点からの距離が1未満'(_格子点の数,X,Y) :- 原点からの距離を三平方の定理で求める(X,Y,_原点からの距離), 1.0 > _原点からの距離. 原点からの距離を三平方の定理で求める(X,Y,_原点からの距離) :- _原点からの距離 is sqrt(X * X + Y * Y). この格子点度数は4分の1の円でのものだから円周率はこの度数を格子点数で割った商を4倍する(_格子点の数,_原点からの距離が1未満の格子点の度数,_円周率) :- _円周率 is _原点からの距離が1未満の格子点の度数 / _格子点の数 * 4. 度数(P,_度数) :- findall(1,P,L), length(L,_度数). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/489 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): # # 円周率 π の値を近似式 # # π ? 4Σ(‐1)^n[{(1/2)^2n+1} +{(1/3)^2n+1}]/( 2 n + 1 ) を用いて小数第8位まで正しい値(3.14159265)を出力し,(Σはn=0。100まで) # # # その π の値を用いて入力された数値 ε に対して,次の不等式を満た # す最小の自然数 N を求めるプログラムを作れ. # # # |{π^2}/6-Σ(k=1.N)1/k^2|<ε # # # # できる方がいたらやり方を教えてください。 :- op(700,xfx,は). 'π ? 4Σ(‐1)^n[{(1/2)^2n+1} +{(1/3)^2n+1}]/( 2 n + 1 ) を用いて小数第8位まで正しい値(3.14159265)を出力する' :- π(X) , write_formatted('%.8f\n',[X]). π(X) :- π(0,100,0,X). π(N,M,X,X) :- N > M,!. π(N,M,Y,X) :- V is 2 * N + 1, U1 is ( 1.0 / 2.0 ) ^ V, U2 is ( 1.0 / 3.0 ) ^ V, W is 4 * ((-1) ^ N) * (U1+U2) / V, N2 is N + 1, Y2 is Y + W, π(N2,M,Y2,X). 'その π の値を用いて入力された数値 ε に対して,次の不等式を満たす最小の自然数Nを求める'(_ε,N) :- between(0,maxint,N), sigma_1(N,Sigma_1), X は abs(π ^ 2 / 6 - Sigma_1), X < _ε,!. sigma_1(N,Sigma_1) :- findsum(U,( between(1,N,K), U is 1 / K ^ 2), Sigma_1). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/562 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10061.txt # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/563 # # [1] 授業単元:ソフトウェア工学 # [2] 問題文(含コード&リンク): # (π/4) = tan^-1(1) = 1 - (1/3) + (1/5) - … + (-1)^k * (1/(2k+1)) + … # の公式を用いて、第n項までの多項式近似により円周率を求め、その誤差と計算時間を測定するプログラムを作成せよ。 func(K,X) :- X is (-1)^K * (1/(2*K+1)). π(M,Pi) :- findsum(U,(for(0,K,M),func(M,U)),S),Pi is S * 4. 計算時間と誤差(M,_計算時間,_誤差) :- A is time,for(1,N,100),π(M,Pi),N=100,B is time, _誤差 is Pi - pi, _計算時間 is (B - A) / 100. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/358 # # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク): # (1)ライプニッツの公式を用いて円周率の近似値を求める時、 # その値が3.14から3.15の間になるまで # nを増やしていき、そのnの値(繰り返し回数)を求めるプログラムを作成せよ。 # # (2)ライプニッツの公式を用いて円周率の近似値を以下の条件で求めよ。 # nの値が増えるにつれ、それまでの近似値の平均値を求め、近似値と平均値の # 差が平均値の1%におさまるまで繰り返す。 ライプニッツの公式 :- findasum(U,for(0,N,100),U is (-1 ^ N) / ( 2 * N + 1)),S), Pai is 4 * S. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/353 # # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク): #   #  円周率を求めよ。方法はどのような方法でも構わない。 #  ただしprintf("%f",M_PI)などはなし。 #  またアルゴリズムのオリジナリティは評価に加点します。 #  (〜の方法では◯桁までしかでないが、このアルゴリズムを追加すると #   桁数が増える など) # #  できるだけ多い桁数を出したいです。 #  また桁数を逐次的に増やす方法が知りたいです。 # #  よろしくお願いします # 'Machinの公式による円周率の算出' :- 'Machinの公式による円周率の算出'(_円周率), writef('%14.11f',[_円周率]). 'Machinの公式による円周率の算出'(_円周率) :- _t is 16.0 / 5.0, _p_2 is 0 + _t / 1, _t_2 is _t / ( -5.0 * 5.0), _k_2 is 1 + 2, 'Machinの公式による円周率の算出'(_k_2,_t_2,0,_p_2,_p_3), _t_3 is 4.0 / 239.0, _p_4 is _p_3 - _t_3 / 1, _t_4 is _t_3 / -239.0 * 239.0, _k_4 is 1 + 2, 'Machinの公式による円周率の算出のニ'(_k_4,_t_4,_p_3,_p_4,_円周率). 'Machinの公式による円周率の算出'(_,_,X,X,X) :- !. 'Machinの公式による円周率の算出'(_k,_t,_,_p,X) :- _p_2 is _p + _t / _k, _t_2 is _t / ( -5.0 * 5.0), _k_2 is _k + 2, 'Machinの公式による円周率の算出'(_k_2,_t_2,_p,_p_2,X). 'Machinの公式による円周率の算出のニ'(_,_,X,X,X) :- !. 'Machinの公式による円周率の算出のニ'(_k,_t,_,_p,X) :- _p_2 is _p - _t / _k, _t_2 is _t / ( -239.0 * 239.0), _k_2 is _k + 2, 'Machinの公式による円周率の算出のニ'(_k_2,_t_2,_p,_p_2,X). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/423 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 問題(戻り値がある場合の引数あり) # 円錐の半径rと高さhを入力し、円錐の体積を求めるプログラムを作りなさい。 # ただし、main関数で円錐の半径rと高さhの入力と計算された円錐の体積の表示を行い、 # 円錐の体積の計算はtaisekiという関数で行うこと。 # また、円周率は3.14を使用すること。 # # ../test/read.cgi/tech/1381909900/422に続きます # '円錐の半径rと高さhを入力し、円錐の体積を求めるプログラムを作りなさい。 ただし、主述語で円錐の半径rと高さhの入力と計算された円錐の体積の表示を行い、 円錐の体積の計算は体積という述語で行うこと。 また、円周率は3.14を使用すること。' :- 数を得る(円錐の半径r,_円錐の半径r), 数を得る(円錐の高さh,_円錐の高さh), '円錐の体積の計算と表示は体積という述語で行うこと。 また、円周率は3.14を使用すること。'(_円錐の半径r,_円錐の高さh,_円錐の体積), writef('半径%t,高さ%t の円錐の体積は %t\n',[_円錐の半径r,_円錐の高さh,_円錐の体積]). '円錐の体積の計算は体積という関数で行うこと。 また、円周率は3.14を使用すること。'(_円錐の半径r,_円錐の高さh,_円錐の体積) :- _円周率 = 3.14, 体積(_円錐の半径r,_円錐の高さh,_円周率,_円錐の体積). 体積(_円錐の半径r,_円錐の高さh,_円周率,_円錐の体積) :- _円錐の体積 is _円周率 * _円錐の半径r * _円錐の半径r * _円錐の高さh / 3. % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/422 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 問題(戻り値が無い場合の引数あり) # 円錐の半径rと高さhを入力し、円錐の体積を求めるプログラムを作りなさい。 # ただし、main関数で円錐の半径rと高さhの入力を行い、円錐の体積の計算と表示はtaisekiという # 関数で行うこと。 # また、円周率は3.14を使用すること。 # # ../test/read.cgi/tech/1381909900/422に続きます # # '円錐の半径rと高さhを入力し、円錐の体積を求めるプログラムを作りなさい。 ただし、主述語で円錐の半径rと高さhの入力を行い、円錐の体積の計算と表示は体積という述語で行うこと。 また、円周率は3.14を使用すること。' :- 数を得る(円錐の半径r,_円錐の半径r), 数を得る(円錐の高さh,_円錐の高さh). '円錐の体積の計算と表示は体積という述語で行うこと。 また、円周率は3.14を使用すること。'(_円錐の半径r,_円錐の高さh), '円錐の体積の計算と表示は体積という述語で行うこと。 また、円周率は3.14を使用すること。'(_円錐の半径r,_円錐の高さh) :- _円周率 = 3.14, 体積(_円錐の半径r,_円錐の高さh,_円周率). 体積(_円錐の半径r,_円錐の高さh,_円周率) :- _円錐の体積 is _円周率 * _円錐の半径r * _円錐の半径r * _円錐の高さh / 3, writef('半径%t,高さ%tの円錐の体積は %t\n',[_円錐の半径r,_円錐の高さh,_円錐の体積]). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/422 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 問題(戻り値が無い場合の引数あり) # 円錐の半径rと高さhを入力し、円錐の体積を求めるプログラムを作りなさい。 # ただし、main関数で円錐の半径rと高さhの入力を行い、円錐の体積の計算と表示はtaisekiという # 関数で行うこと。 # また、円周率は3.14を使用すること。 # # ../test/read.cgi/tech/1381909900/422に続きます # # '円錐の半径rと高さhを入力し、円錐の体積を求めて表示するプログラムを作りなさい。 円周率は3.14を使用すること。' :- '円錐の半径rと高さhを入力し、'(_円錐の半径r,_円錐の高さh), _円周率 = 3.14, 円錐の体積を求めて(_円錐の半径r,_円錐の高さh,_円周率,_円錐の体積), 表示する(_円錐の半径r,_円錐の高さh,_円錐の体積). '円錐の半径rと高さhを入力し、'(_円錐の半径r,_円錐の高さh) :- 数を得る(円錐の半径r,_円錐の半径r), 数を得る(円錐の高さh,_円錐の高さh). 円錐の体積を求めて(_円錐の半径r,_円錐の高さh,_円周率,_円錐の体積) :- _円錐の体積 is _円周率 * _円錐の半径r * _円錐の半径r * _円錐の高さh / 3. 表示する(_円錐の半径r,_円錐の高さh,_円錐の体積) :- writef('半径%t,高さ%tの円錐の体積は %t\n',[_円錐の半径r,_円錐の高さh,_円錐の体積]). % 以下のサイトは # # モンテカルロ法により円周率を求める # 試行限界数(10000000). モンテカルロ法により円周率を求める(_試行限界数,_円周率) :- var(_試行限界数), 試行限界数(_試行限界数), モンテカルロ法により円周率を求める(0,_試行限界数,0,_円周率),!. モンテカルロ法により円周率を求める(_試行限界数,_円周率) :- モンテカルロ法により円周率を求める(0,_試行限界数,0,_円周率). モンテカルロ法により円周率を求める(_試行限界数,_試行限界数,_四分の一円の内部に落ちた数,_円周率) :- _円周率 is (_四分の一円の内部に落ちた数 * 4.0) / _試行限界数,!. モンテカルロ法により円周率を求める(N,_試行限界数,S,_円周率) :- '_x,_yを乱数から求め、ピタゴラスの定理を使って座標点(_x,_y)が四分の一円の内部にあるならば加算する'(S,S2), N2 is N + 1, モンテカルロ法により円周率を求める(N2,_試行限界数,S2,_円周率),!. '_x,_yを乱数から求め、ピタゴラスの定理を使って座標点(_x,_y)が四分の一円の内部にあるならば加算する'(S,S2) :- '0から1の乱数2つをペアにし、片方をx座標、もう1方をyとする'(_x,_y), ピタゴラスの定理を使って座標点が円の内部であるか判定する(_x,_y), S2 is S + 1,!. '_x,_yを乱数から求め、ピタゴラスの定理を使って座標点(_x,_y)が四分の一円の内部にあるならば加算する'(S,S). '0から1の乱数2つをペアにし、片方をx座標、もう1方をyとする'(_x,_y) :- _x is random(100001) / 100000, _y is random(100001) / 100000,!. ピタゴラスの定理を使って座標点が円の内部であるか判定する(_x,_y) :- 1.0 >= _x * _x + _y * _y. % 以下のサイトは # # モンテカルロ法により円周率を求める # 試行限界数(10000000). モンテカルロ法により円周率を求める(_試行限界数,_円周率) :- var(_試行限界数), 試行限界数(_試行限界数), モンテカルロ法により円周率を求める(_試行限界数,_円周率),!. モンテカルロ法により円周率を求める(_試行限界数,_円周率) :- count('_x,_yを乱数から求め、ピタゴラスの定理を使って座標点(_x,_y)が四分の一円の内部であるか判定する'(_試行限界数), _四分の一円の内部に落ちた数), _円周率 is (_四分の一円の内部に落ちた数 * 4.0) / _試行限界数. '_x,_yを乱数から求め、ピタゴラスの定理を使って座標点(_x,_y)が四分の一円の内部であるか判定する'(_試行限界数) :- between(1,_試行限界数,_), '0から1の乱数2つをペアにし、片方をx座標、もう1方をyとする'(_x,_y), ピタゴラスの定理を使って座標点が円の内部であるか判定する(_x,_y). '0から1の乱数2つをペアにし、片方をx座標、もう1方をyとする'(_x,_y) :- _x is random(100001) / 100000, _y is random(100001) / 100000,!. ピタゴラスの定理を使って座標点が円の内部であるか判定する(_x,_y) :- 1.0 >= _x * _x + _y * _y. count(P,N) :- findall(1,P,L), length(L,N). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/928 # # [1] 授業単元:情報処理2 # [2] 問題文(含コード&リンク): # 1.自然数n1・n2(n1<n2)を入力し、n1からn2までの数の合計sを計算しその結果を表示しなさい #   ただし、sは次式で表せれるものとする。s=n2・(n2+1)-(n1-1)/2 # # 2. 球の半径rを入力し、球の体積vを計算し、少数第2位まで表示しなさい # π=3.1415 # 半径を入力してください-->10 # 答えは4188.79になります。 # '球の半径rを入力し、球の体積vを計算し、少数第2位まで表示しなさい' :- '球の半径rを入力し'(_球の半径), '球の体積vを計算し'(_球の半径,_球の体積), '少数第2位まで表示しなさい'(_球の体積). '球の半径rを入力し'(_球の半径) :- 数を得る(球の半径,_球の半径 > 0.0,_球の半径). '球の体積vを計算し'(_球の半径,_球の体積) :- _球の体積 is (4 / 3) * pi * _球の半径 ^ 3. '少数第2位まで表示しなさい'(_球の体積) :- format('答えは~2fになります。\n',[_球の体積]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/928 # # [1] 授業単元:情報処理2 # [2] 問題文(含コード&リンク): # 1.自然数n1・n2(n1自然数を得る(n1,true,_n1), 自然数を得る(n2,_n2 > _n1,_n2),!. 'n1からn2までの数の合計sを計算する。ただし、合計sは次式で表せれるものとする。s=n2・(n2+1)-(n1-1)/2'(_n1,_n2,_n1からn2までの合計) :- _n1からn2までの合計 is _n2 * (_n2 + 1) - (_n1 - 1) / 2. その結果を表示する(_n1,_n2,_n1からn2までの合計) :- writef('%tから%tまでの合計は %t です\n',[_n1,_n2,_n1からn2までの合計]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/409 # # [1] 授業単元:C言語 アルゴリズム # [2] 問題文(含コード&リンク):モンテカルロ法 # http://ime.nu/codepad.org/6m1GPoV0 # # /* # 問題1. サイコロを10,100,1000,10000,100000 回投げて分布を調べよ。 # # 問題2. コイン投げも同様にして、Sn = X1 + ・・・ + Xn のSn, # そのmax、min を調べよ。 # # 問題3.   # 面積 # 1 # ∫ x^2dx をモンテカルロ法で求めよ # 0 # # 問題4. πの値をモンテカルロ法で求めよ。 # 問題5. 2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。 # */ # '2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。' :- findall(Count,( between(1,100,N), count((between(1,100,M), U is random(1000), U < 400), Count)), L), 分布を表示する(L). 分布を表示する(L) :- between(0,100,N), 表示文字列を生成(N,L,_表示文字列), writef('%t: %t\n',[_カウント表示文字列]), N = 100. 表示文字列を生成(N,L,_表示文字列) :- 整数から文字列(2,Count,_カウント表示文字列), findall((*),( member(N,L)), L), atomic_list_concat([_カウント表示文字列,': '|L],_表示文字列). 整数から文字列(_文字列桁,_整数,_文字列) :- 桁不足の場合頭部には空白を詰める(_文字列桁,_整数,_文字列),!. 整数から文字列(_文字列桁,_整数,_文字列) :- atom_number(_文字列,_整数). 桁不足の場合頭部には空白を詰める(_文字列桁,_整数,_文字列) :- length(L,_文字列桁), number_chars(_整数,Chars), append(L0,Chars,L), all(L0,' '), atomic_list_concat(L,_文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/409 # # [1] 授業単元:C言語 アルゴリズム # [2] 問題文(含コード&リンク):モンテカルロ法 # http://ime.nu/codepad.org/6m1GPoV0 # # /* # 問題1. サイコロを10,100,1000,10000,100000 回投げて分布を調べよ。 # # 問題2. コイン投げも同様にして、Sn = X1 + ・・・ + Xn のSn, # そのmax、min を調べよ。 # # 問題3.   # 面積 # 1 # ∫ x^2dx をモンテカルロ法で求めよ # 0 # # 問題4. πの値をモンテカルロ法で求めよ。 # 問題5. 2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。 # */ 'πの値をモンテカルロ法で求めよ'(_pi) :- 'πの値をモンテカルロ法で求めよ'(0,[],L), length(L,_頻度), _pi is _頻度 * 4 / 100000. 'πの値をモンテカルロ法で求めよ'(100000,L,L) :- !. 'πの値をモンテカルロ法で求めよ'(N,L_1,L) :- '点が四分の一円弧の内側の時はカウントする'(L_1,L), N_2 is N + 1, 'πの値をモンテカルロ法で求めよ'(N_2,L_2,L). '点が四分の一円弧の内側の時はカウントする'(L_1,[1|L_1] _x is random(10001) / 10000, _y is random(10001) / 10000, _x ^ 2 + _y ^ 2 >= 1.0,!. '点が四分の一円弧の内側の時はカウントする'(L,L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/409 # # [1] 授業単元:C言語 アルゴリズム # [2] 問題文(含コード&リンク):モンテカルロ法 # http://ime.nu/codepad.org/6m1GPoV0 # # /* # 問題1. サイコロを10,100,1000,10000,100000 回投げて分布を調べよ。 # # 問題2. コイン投げも同様にして、Sn = X1 + ・・・ + Xn のSn, # そのmax、min を調べよ。 # # 問題3.   # 面積 # 1 # ∫ x^2dx をモンテカルロ法で求めよ # 0 # # 問題4. πの値をモンテカルロ法で求めよ。 # 問題5. 2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。 # */ # # '1 ∫ x^2dx をモンテカルロ法で求めよ 0'(_積分値) :- '区間0..1範囲のx^2dxの積分値をモンテカルロ法で求めよ'(_積分値). '区間0..1範囲のx^2dxの積分値をモンテカルロ法で求めよ'(_積分値) :- 'x^2dx をモンテカルロ法で求めよ'(0,0,_頻度), _積分値 is _頻度 / 100000. '区間0..1範囲のx^2dxの積分値をモンテカルロ法で求めよ'(100000,_頻度,_頻度) :- !. '区間0..1範囲のx^2dxの積分値をモンテカルロ法で求めよ'(N,_頻度_1,_頻度) :- 頻度を更新する(_頻度_1,_頻度_2), N_2 is N + 1, '区間0..1範囲のx^2dxの積分値をモンテカルロ法で求めよ'(N_2,_頻度_2,_頻度). 頻度を更新する(_頻度_1,_頻度_2) :- _x is random(10001) / 10000, _y is random(10001) / 10000, _y =< _x ^ 2, _頻度_2 is _頻度_1 + 1,!. 頻度を更新する(_頻度,_頻度). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/409 # # [1] 授業単元:C言語 アルゴリズム # [2] 問題文(含コード&リンク):モンテカルロ法 # http://ime.nu/codepad.org/6m1GPoV0 # # /* # 問題1. サイコロを10,100,1000,10000,100000 回投げて分布を調べよ。 # # 問題2. コイン投げも同様にして、Sn = X1 + ・・・ + Xn のSn, # そのmax、min を調べよ。 # # 問題3.   # 面積 # 1 # ∫ x^2dx をモンテカルロ法で求めよ # 0 # # 問題4. πの値をモンテカルロ法で求めよ。 # 問題5. 2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。 # */ # 'コイン投げも同様にして、Sn = X1 + ・・・ + Xn のSn,そのmax、min を調べよ。'(_n) :- append(_,[_試行回数|R],[10,100,1000,10000,100000]), 試行回数の集計ならび(_試行回数,_最大値,_最小値), 整数から文字列(6,_試行回数,_試行回数文字列), writef('試行回数%t: 最大値=%t 最小値=%t\n',[_試行回数文字列,_最大値,_最小値]), R = []. 試行回数の集計ならび(_試行回数,_最大値,_最小値) :- findall(S,( between(1,_試行回数,_), count(( between(1,_n,_), 1 is random(1)), S)), L), min(L,_最小値), max(L,_最大値),!. 整数から文字列(_文字列桁,_整数,_文字列) :- 桁不足の場合頭部には空白を詰める(_文字列桁,_整数,_文字列),!. 整数から文字列(_文字列桁,_整数,_文字列) :- atom_number(_文字列,_整数). 桁不足の場合頭部には空白を詰める(_文字列桁,_整数,_文字列) :- length(L,_文字列桁), number_chars(_整数,Chars), append(L0,Chars,L), all(L0,' '), atomic_list_concat(L,_文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/409 # # [1] 授業単元:C言語 アルゴリズム # [2] 問題文(含コード&リンク):モンテカルロ法 # http://ime.nu/codepad.org/6m1GPoV0 # # /* # 問題1. サイコロを10,100,1000,10000,100000 回投げて分布を調べよ。 # # 問題2. コイン投げも同様にして、Sn = X1 + ・・・ + Xn のSn, # そのmax、min を調べよ。 # # 問題3.   # 面積 # 1 # ∫ x^2dx をモンテカルロ法で求めよ # 0 # # 問題4. πの値をモンテカルロ法で求めよ。 # 問題5. 2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。 # */ 'サイコロを10,100,1000,10000,100000 回投げて分布を調べよ'(N,0,0,0,0,0,0,_1,_2,_3,_4,_5,_6) :- append(_,[_何回|R],[10,100,1000,10000,100000]), サイコロの目の頻度(0,_何回,L1,L2), writef('投げた回数..%t, 1..%t,2..%t,3..%t,4..%t,5..%t,6..%t\n',[_何回|L2]), R = []. サイコロの目の頻度(_何回,_何回,L,L) :- !. サイコロの目の頻度(N,_何回,L1,L) :- _サイコロの目 is random(6) + 1, 頻度に加算(_サイコロの目,L1,L2), N_2 is N + 1, サイコロの目の頻度(N_2,_何回,L2,L). 頻度に加算(1,[_1,_2,_3,_4,_5,_6],[_1_2,_2,_3,_4,_5,_6]) :- _1_2 is _1 + 1. 頻度に加算(2,[_1,_2,_3,_4,_5,_6],[_1,_2_2,_3,_4,_5,_6]) :- _2_2 is _2 + 1. 頻度に加算(3,[_1,_2,_3,_4,_5,_6],[_1,_2,_3_2,_4,_5,_6]) :- _3_2 is _3 + 1. 頻度に加算(4,[_1,_2,_3,_4,_5,_6],[_1,_2,_3,_4_2,_5,_6]) :- _4_2 is _4 + 1. 頻度に加算(5,[_1,_2,_3,_4,_5,_6],[_1,_2,_3,_4,_5_2,_6]) :- _5_2 is _5 + 1. 頻度に加算(6,[_1,_2,_3,_4,_5,_6],[_1,_2,_3,_4,_5,_6_2]) :- _6_2 is _6 + 1. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/599 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):y=f(x)=2sin(πx/4) 0≦x≦1において0.1きざみでx,yの値はどのように変わるのか?配列変数を用いて作成せよ。 # f(_x,_y) :- _y is 2 * sin(pi * _x / 4). 'y=f(x)=2sin(πx/4) 0≦x≦1において0.1きざみでx,yの値はどのように変わるのか'(_x_yの値ならび) :- findall([_x,_y],( between(0,10,N), _x is N / 10, f(_x,_y)), _x_y_の値ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/81 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): # # xが十分小さいとき、次の式を使ってsinxを近似的に求める事ができる。 # sinx=x-x^3/3!+x^5/5!-x^7/7! # 0.05π刻みで、0.0からπまでのxについて、math.hに含まれている関数 # sin()と値を比較しなさい。 # ただし、円周率πはmath.hに含まれているマクロ M_PIを使用するか、 # 三角関数を用いて正確に計算した値を使うこと。 # '0.05π刻みで、0.0からπまでのxについて、関数のsin値と比較する'(X,Y,Z) :- 'xが十分小さいとき、次の式を使ってsinxを近似的に求める事ができる。sinx=x-x^3/3!+x^5/5!-x^7/7! 0.05π刻みで、0.0からπまでのxについて、関数のsin値と比較する'(0.0,X,Y,Z). 'xが十分小さいとき、次の式を使ってsinxを近似的に求める事ができる。sinx=x-x^3/3!+x^5/5!-x^7/7! 0.05π刻みで、0.0からπまでのxについて、関数のsin値と比較する'(X,X,Y,Z) :- X =< pi, 'xが十分小さいとき、次の式を使ってsinxを近似的に求める事ができる。sinx=x-x^3/3!+x^5/5!-x^7/7!'(X,Y,Z). 'xが十分小さいとき、次の式を使ってsinxを近似的に求める事ができる。sinx=x-x^3/3!+x^5/5!-x^7/7! 0.05π刻みで、0.0からπまでのxについて、関数のsin値と比較する'(X_1,X,Y,Z) :- X_1 =< pi, X_2 is X_1 + 0.1 * pai, 'xが十分小さいとき、次の式を使ってsinxを近似的に求める事ができる。sinx=x-x^3/3!+x^5/5!-x^7/7! 0.05π刻みで、0.0からπまでのxについて、関数のsin値と比較する'(X_2,X,Y,Z). 'xが十分小さいとき、次の式を使ってsinxを近似的に求める事ができる。sinx=x-x^3/3!+x^5/5!-x^7/7!'(X,Y,Z) :- 'xが十分小さいとき、次の式を使ってsinxを近似的に求める事ができる。sinx=x-x^3/3!+x^5/5!-x^7/7!'(X,Y), Z is sin(X). 'xが十分小さいとき、次の式を使ってsinxを近似的に求める事ができる。sinx=x-x^3/3!+x^5/5!-x^7/7!'(X,Y) :- Y is X - X ^ 3 / (3 * 2) + X ^ 5 / (5 * 4 * 3 * 2) - X ^ 7 / (7 * 6 * 5 * 4 * 3 * 2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/81 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): # # xが十分小さいとき、次の式を使ってsinxを近似的に求める事ができる。 # sinx=x-x^3/3!+x^5/5!-x^7/7! # 0.05π刻みで、0.0からπまでのxについて、math.hに含まれている関数 # sin()と値を比較しなさい。 # ただし、円周率πはmath.hに含まれているマクロ M_PIを使用するか、 # 三角関数を用いて正確に計算した値を使うこと。 # '0.05π刻みで、0.0からπまでのxについて、関数のsin値と比較する'(X,Y,Z) :- 'xが十分小さいとき、次の式を使ってsinxを近似的に求める事ができる。sinx=x-x^3/3!+x^5/5!-x^7/7! 0.05π刻みで、0.0からπまでのxについて、関数のsin値と比較する'(0.0,X,Y,Z). 'xが十分小さいとき、次の式を使ってsinxを近似的に求める事ができる。sinx=x-x^3/3!+x^5/5!-x^7/7! 0.05π刻みで、0.0からπまでのxについて、関数のsin値と比較する'(X,X,Y,Z) :- X =< pi, 'xが十分小さいとき、次の式を使ってsinxを近似的に求める事ができる。sinx=x-x^3/3!+x^5/5!-x^7/7!'(X,Y,Z). 'xが十分小さいとき、次の式を使ってsinxを近似的に求める事ができる。sinx=x-x^3/3!+x^5/5!-x^7/7! 0.05π刻みで、0.0からπまでのxについて、関数のsin値と比較する'(X_1,X,Y,Z) :- X_1 =< pi, X_2 is X_1 + 0.1 * pai, 'xが十分小さいとき、次の式を使ってsinxを近似的に求める事ができる。sinx=x-x^3/3!+x^5/5!-x^7/7! 0.05π刻みで、0.0からπまでのxについて、関数のsin値と比較する'(X_2,X,Y,Z). 'xが十分小さいとき、次の式を使ってsinxを近似的に求める事ができる。sinx=x-x^3/3!+x^5/5!-x^7/7!'(X,Y,Z) :- 'xが十分小さいとき、次の式を使ってsinxを近似的に求める事ができる。sinx=x-x^3/3!+x^5/5!-x^7/7!'(X,Y), Z is sin(X). 'xが十分小さいとき、次の式を使ってsinxを近似的に求める事ができる。sinx=x-x^3/3!+x^5/5!-x^7/7!'(X,Y) :- Y is X - X ^ 3 / (3 * 2) + X ^ 5 / (5 * 4 * 3 * 2) - X ^ 7 / (7 * 6 * 5 * 4 * 3 * 2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/531 # # [1] 授業単元:プログラミングI # [2] 問題文(含コード&リンク):角度0度から90度までのsin(x)の値を1度刻みで表示する # プログラムを作りなさい。 # πの値は3.141592ではなく、M_PIを用いること。 # '角度0度から90度までのsin(x)の値を1度刻みで表示する' :- for(0,_角度,90), Y is sin(pi * _角度 / 180), writef('%t度 %t\n',[Y]), _角度 = 90. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/335 # # [1] 授業単元:楽しいプログラミング # [2] 問題文(含コード&リンク): 以下の実行例のように,三角形の2 辺の長さとその2 # 辺のなす角(0〜180[deg])を入力すると,もう1 辺の # 長さと,三角形の面積を表示するプログラムを作成せ # よ.π = 3.14159265 とする. #  [3.1] OS: linux #  [3.2] コンパイラ名とバージョン: gcc 3.4 #  [3.3] 言語: C # [4] 期限:2011年11月17日 9:00まで # [5] その他の制限: while, if, for, 配列まで # # 例 #  三角形の2 辺の長さを入力してください。 # 辺1:-3.0 # 正の値を入力してください。辺1:3.0 # 辺2:6.0 # 2 辺のなす角度[deg] を入力してください:200.0 # 0<角度[deg]<180 の値を入力してください。30.0 # もう1 辺の長さ= 3.717941 # 三角形の面積= 4.500000 # # '三角形の2 辺の長さとその2辺のなす角(0〜180[deg])を入力すると,もう1 辺の長さと,三角形の面積を表示するプログラムを作成せよ.π = 3.14159265 とする' :- '三角形の2 辺の長さとその2辺のなす角(0〜180[deg])を入力すると'(_辺の長さ_1,_辺の長さ_2,_2辺のなす角), もう1辺の長さと三角形の面積を表示する(_辺の長さ_1,_辺の長さ_2,_2辺のなす角). '三角形の2 辺の長さとその2辺のなす角(0〜180[deg])を入力すると'(_辺の長さ_1,_辺の長さ_2,_2辺のなす角) :- write('三角形の2 辺の長さを入力してください。 '), 辺の長さ_1の入力(_辺の長さ_1), 辺の長さ_2の入力(_辺の長さ_2), '2辺のなす角の入力'(_2辺のなす角). 辺の長さ_1の入力(_辺の長さ_1) :- write('辺[1] : '), get_line(Line), 辺の長さ_1の入力診断(Line,_辺の長さ_1),!. 辺の長さ_1の入力(_辺の長さ_1) :- 辺の長さ_1の入力(_辺の長さ_1). 辺の長さ_2の入力(_辺の長さ_2) :- write('辺[2] : '), get_line(Line), 辺の長さの入力診断(Line,_辺の長さ_2),!. 辺の長さ_2の入力(_辺の長さ_2) :- 辺の長さ_2の入力(_辺の長さ_2). 辺の長さの入力診断(Line,_辺の長さ) :- atom_to_term(Line,_辺の長さ,_), number(_辺の長さ), _辺の長さ > 0.0,!. 辺の長さの入力診断(Line,_辺の長さ) :- writef('入力された %t からは三角形の辺にあたる情報が得られません。再入力をお願いします。\n',[Line]), fail. '2辺のなす角の入力'(_2辺のなす角) :- write('2辺のなす角度を入力して下さい (0<角度<180) : '), get_line(Line), '2辺のなす角の入力診断'(Line,_2辺のなす角),!. '2辺のなす角の入力'(_2辺のなす角) :- '2辺のなす角の入力(_2辺のなす角). '2辺のなす角の入力診断'(Line,_2辺のなす角) :- atom_to_term(Line,_2辺のなす角), number(_2辺のなす角), _2辺のなす角 > 0.0, _2辺のなす角 < 180.0,!. '2辺のなす角の入力診断'(Line,_2辺のなす角) :- writef('入力された%t からは2辺のなす角を得られません。再入力をお願いします。\n',[Line]), fail. もう1辺の長さと三角形の面積を表示する(_辺の長さ_1,_辺の長さ_2,_2辺のなす角) :- _辺の長さ_2 >= _辺の長さ_1, もう1辺の長さ(_辺の長さ_1,_辺の長さ_2,_2辺のなす角,_もう1辺の長さ), 三角形の面積(_辺の長さ_1,_辺の長さ_2,_2辺のなす角,_三角形の面積), 表示する(_もう1辺の長さ,_三角形の面積),!. もう1辺の長さと三角形の面積を表示する(_辺の長さ_1,_辺の長さ_2,_2辺のなす角) :- _辺の長さ_2 < _辺の長さ_1, もう1辺の長さと三角形の面積を表示する(_辺の長さ_2,_辺の長さ_1,_2辺のなす角). もう1辺の長さ(_辺の長さ_1,_辺の長さ_2,_2辺のなす角,_もう1辺の長さ) :- _三角形の高さ is _辺の長さ_1 * sin(_2辺のなす角 / 180 * pi), _辺の長さ_2_1 is _辺の長さ_1 * cos(_2辺のなす角 / 180 * pi), _辺の長さ_2_2 is _辺の長さ_2 - _辺の長さ_2_1, _もう1辺の長さ is sqrt(_辺の長さ_2_2 * _辺の長さ_2_2 + _三角形の高さ * _三角形の高さ). 三角形の面積(_辺の長さ_1,_辺の長さ_2,_2辺のなす角,_三角形の面積) :- _三角形の高さ is _辺の長さ_1 * sin(_2辺のなす角 / 180 * pi), _三角形の面積 is _辺の長さ_2 * _三角形の高さ / 2. 表示する(_もう1辺の長さ,_三角形の面積) :- writef('%16c : %12r\n%16c : %12r\n',[もう1辺の長さ,_もう1辺の長さ,三角形の面積,_三角形の面積]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/827 # # [1] 授業単元:モンテカルロ # [2] 問題文(含コード&リンク):http://ime.nu/ideone.com/foLSr # # 問題1. サイコロを10, 100 ,1000 ,10000 ,100000 回投げて分布を調べよ。 # 問題2. コイン投げも同様にして、Sn = X1 +....+ Xn のSn, そのmax,min を調べよ。 # 問題3.  面積 # ∫ 1 # 0 x^2 dx # をモンテカルロ法で求めよ。 # # 問題4. π の値をモンテカルロ法で求めよ。 # 問題5. 2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。 '2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示する'(_n) :- _p = 0.4, findall([_k,Y],( for(0,_k,_n), Y is (_p^_k) * (1-_p)^(_n-_k)), _二項分布), '分布は、**** を打って表示する'(_二項分布). '分布は、**** を打って表示する'([]). '分布は、**** を打って表示する'([[_k,Y]|R]) :- 'Yを0から100まで範囲に変換'(Y,Y2), 星並びアトムを作る(Y2,_星並びアトム), 横向きにグラフ表示(_k,_星並びアトム), '分布は、**** を打って表示する'(R). 'Yを0から100まで範囲に変換'(Y,Y2) :- Y2 is truncate(Y * 100). 星並びアトムを作る(N,_星並びアトム) :- length(L,N), all(L,'*'), concat_atom(L,_星ならぴアトム). 横向きにグラフ表示(_k,_星並びアトム) :- writef('%4c: %t\n',[_k,_星並びアトム]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/827 # # [1] 授業単元:モンテカルロ # [2] 問題文(含コード&リンク):http://ime.nu/ideone.com/foLSr # # 問題1. サイコロを10, 100 ,1000 ,10000 ,100000 回投げて分布を調べよ。 # 問題2. コイン投げも同様にして、Sn = X1 +....+ Xn のSn, そのmax,min を調べよ。 # 問題3.  面積 # ∫ 1 # 0 x^2 dx # をモンテカルロ法で求めよ。 # # 問題4. π の値をモンテカルロ法で求めよ。 # 問題5. 2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。 'π の値をモンテカルロ法で求める'(_π の値) count(( for(1,N,10000), X is random(1000) / 1000, Y is random(1000) / 1000, ピタゴラスの定理を使って座標点が円の内部であるか判定する(_x,_y)), Count), _π の値 is Count / (10000 / 4). ピタゴラスの定理を使って座標点が円の内部であるか判定する(_x,_y) :- 1.0 >= _x * _x + _y * _Y. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/827 # # [1] 授業単元:モンテカルロ # [2] 問題文(含コード&リンク):http://ime.nu/ideone.com/foLSr # # 問題1. サイコロを10, 100 ,1000 ,10000 ,100000 回投げて分布を調べよ。 # 問題2. コイン投げも同様にして、Sn = X1 +....+ Xn のSn, そのmax,min を調べよ。 # 問題3.  面積 # ∫ 1 # 0 x^2 dx # をモンテカルロ法で求めよ。 # # 問題4. π の値をモンテカルロ法で求めよ。 # 問題5. 2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。 'モンテカルロ法で積分区間0-1のx^2の値を求める'(_試行回数,_値) :- count(( between(1,_試行回数,_), X is random(1000), Y is random(1000),Y =< X * X), Count), _値 is Count / _試行回数. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/827 # # [1] 授業単元:モンテカルロ # [2] 問題文(含コード&リンク):http://ime.nu/ideone.com/foLSr # # 問題1. サイコロを10, 100 ,1000 ,10000 ,100000 回投げて分布を調べよ。 # 問題2. コイン投げも同様にして、Sn = X1 +....+ Xn のSn, そのmax,min を調べよ。 # 問題3.  面積 # ∫ 1 # 0 x^2 dx # をモンテカルロ法で求めよ。 # # 問題4. π の値をモンテカルロ法で求めよ。 # 問題5. 2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。 'コイン投げも同様にして、Sn = X1 +....+ Xn のSn, そのmax,min を調べよ。'(_n,_分布ならび) :- findall([_回数,_Sn,_max,_min],( append(_,[_回数|_],[10,100,1000,10000,100000]), 'コインを指定された回数投げて_Sn,_max,_minを得る'(_回数,_n,_Sn,_Max,_Min)), _分布ならび). 'コインを指定された回数投げて_Sn,_max,_minを得る'(_回数,_n,_Sn,_Max,_Min) :- findall(_合計,( for(1,_,_回数), 'コインを_n回投げて表となった回数'(_n,_合計)), L), sum(L,_Sn), max(L,_max), min(L,_min). 'コインを_n回投げて表となった合計'(_n,_合計回数) :- count((for(1,_,_n),1 is random(2)),_合計回数). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/827 # # [1] 授業単元:モンテカルロ # [2] 問題文(含コード&リンク):http://ime.nu/ideone.com/foLSr # # 問題1. サイコロを10, 100 ,1000 ,10000 ,100000 回投げて分布を調べよ。 # 問題2. コイン投げも同様にして、Sn = X1 +....+ Xn のSn, そのmax,min を調べよ。 # 問題3.  面積 # ∫ 1 # 0 x^2 dx # をモンテカルロ法で求めよ。 # # 問題4. π の値をモンテカルロ法で求めよ。 # 問題5. 2 項分布をp=0.4 として実行してみよ。分布は、**** を打って表示せよ。 'サイコロを10, 100 ,1000 ,10000 ,100000 回投げて分布を調べよ。'(_分布ならび) :- findall([_n,_1,_2,_3,_4,_5,_6],( append(_,[_n|_],[10,100,100,10000,100000]), 'サイコロを_n回投げて分布を調べる'(_n,0,0,0,0,0,0,_1,_2,_3,_4,_5,_6)), _分布ならび). 'サイコロを_n回投げて分布を調べる'(0,_1,_2,_3,_4,_5,_6,_1,_2,_3,_4,_5,_6). 'サイコロを_n回投げて分布を調べる'(N,_1_1,_2_1,_3_1,_4_1,_5_1,_6_1) :- 賽を投げる(_賽の目), 分布の更新(_賽の目,_1_1,_2_1,_3_1,_4_1,_5_1,_6_1,_1_2,_2_2,_3_2,_4_2,_5_2,_6_2), N_1 is N - 1, 'サイコロを_n回投げて分布を調べる'(N_1,_1_2,_2_2,_3_2,_4_2,_5_2,_6_2,_1,_2,_3_4,_5,_6). 賽を投げる(_賽の目) :- _賽の目 is random(6) + 1. 分布の更新(1,_1_1,_2,_3,_4,_5,_6,_1_2,_2,_3,_4,_5,_6) :- _1_2 is _1_1 + 1. 分布の更新(2,_1,_2_1,_3,_4,_5,_6,_1,_2_2,_3,_4,_5,_6) :- _2_2 is _2_1 + 1. 分布の更新(3,_1,_2,_3_1,_4,_5,_6,_1,_2,_3_2,_4,_5,_6) :- _3_2 is _3_1 + 1. 分布の更新(4,_1,_2,_3,_4_1,_5,_6,_1,_2,_3,_4_2,_5,_6) :- _4_2 is _4_1 + 1. 分布の更新(5,_1,_2,_3,_4,_5_1,_6,_1,_2,_3,_4,_5_2,_6) :- _5_2 is _5_1 + 1. 分布の更新(6,_1,_2,_3,_4,_5,_6_1,_1,_2,_3,_4,_5,_6_2) :- _6_2 is _6_1 + 1. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/761 # # [1] 授業単元:プログラミング演習 # [2] 問題文: # 円1:x^2+y^2=r^2と円2:(x-r)^2+(y-r)^2=r^2が重なっている部分の面積を求めるプログラムを作成しなさい。 # ただしπ=3,14159とする。               # 'x^2+y^2=r^2と円2:(x-r)^2+(y-r)^2=r^2が重なっている部分の面積を求める'(_r,_重なっている部分の面積) :- count(( for(1,N,100000), _x is random(1001) / 1000, _y is random(1001) / 1000, 1.0 =< _x * _x + _y * _y), COUNT), _重なっている部分の面積 is _r * _r * ( 1 - 2 * COUNT / 100000). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/761 # # [1] 授業単元:プログラミング演習 # [2] 問題文: # 円1:x^2+y^2=r^2と円2:(x-r)^2+(y-r)^2=r^2が重なっている部分の面積を求めるプログラムを作成しなさい。 # ただしπ=3,14159とする。               # 'x^2+y^2=r^2と円2:(x-r)^2+(y-r)^2=r^2が重なっている部分の面積を求める'(_r,_重なっている部分の面積) :- _重なっている部分の面積 is _r * _r * ( 1 - 2 * 3.14159 / 4). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/569 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # int k を受け取り, 以下の級数 # # Sk= 1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + ... + (-1)k/(2k+1) # の値を返す関数 double my_series ( int k ) を作成せよ. main 文では scanf で int n を受け取り, 級数 Sk の値を k = 0, 1, 2, ..., n について計算し, 結果を表示せよ. # (ヒント k が大きくなると 4Sk は円周率に近づく.) # f(X,Y) :- Y is (-1) * X / ( 2 * X + 1). 'Sk= 1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + ... + (-1)k/(2k+1)'(_k,_SK) :- findsum(S, for(1,N,_k), f(N,S)), _SK). main(_n) :- for(0,_k,_n), 'Sk= 1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + ... + (-1)k/(2k+1)'(_k,_SK), writef('%t\n',[_SK]), _k = _n,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/580 # # モンテカルロ法を使って円周率を求めるものなんですが指定されたプログラム(下に載せました)に # (1)全試行回数と結果を表示する間隔をscanf()で読みそれにしたがって処理が進むようにする。 # (2)各途中経過で求めたπの近似値のうち最もπの真値(=3.14159)に近い値とその時の試行回数を最後に表示させる。 # という2つの点を加えて改良しなければならないのですがどなたか教えていただけませんか? # 限界試行回数(100000). piの仮の真値(3.14159). モンテカルロ法により円周率を求める(_試行回数,_円周率) :- 限界試行回数(_限界試行回数), '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(0,_限界試行回数,0,_試行回数,_円周率),!. '0から1の乱数2つをペアにし、片方をx座標、もう1方をyとする'(_x,_y) :- _x is random(1001) / 1000, _y is random(1001) / 1000,!. '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(Max,Max,_内側に落ちた累積数,Max,_r) :- _r is (_内側に落ちた累積数 / Max) * 4,!. '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(_試行回数,Max,_内側に落ちた累積数,_試行回数,_r) :- piの仮の真値の誤差範囲に入った(_内側に落ちた累積数,_試行回数,_r),!. '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(N,Max,_内側に落ちた累積数,_試行回数,_r) :- '新しい乱数ペアは円の内部にある'(N,_内側に落ちた累積数,N2,_内側に落ちた累積数2), '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(N2,Max,_内側に落ちた累積数2,_試行回数,_r). '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(N,Max,_内側に落ちた累積数,_試行回数,_r) :- N2 is N + 1, '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(N2,Max,_内側に落ちた累積数,_試行回数,_r). piの仮の真値の誤差範囲に入った(_内側に落ちた累積数,_試行回数,_r) :- _試行回数 > 0, piの仮の真値(_piの真値), _r is (_内側に落ちた累積数 / _試行回数) * 4, _piの真値 is floor(_r * 100000 + 0.5) / 100000,!. '新しい乱数ペアは円の内部にある'(N,_内側に落ちた累積数,N2,_内側に落ちた累積数2) :- '0から1の乱数2つをペアにし、片方をx座標、もう1方をyとする'(_x,_y), ピタゴラスの定理を使って座標点が円の内部であるか判定する(_x,_y), N2 is N + 1, _内側に落ちた累積数2 is _内側に落ちた累積数 + 1,!. ピタゴラスの定理を使って座標点が円の内部であるか判定する(_x,_y) :- 1.0 >= _x * _x + _y * _y. '新しい乱数ペアは円の内部にある'(N,_内側に落ちた累積数,N2,_内側に落ちた累積数2) :- % 以下のサイトは # 水深の求め方がわかりません。 # # ある湾の水深をロープで測って時間と共に水深を記録したのですが、 # 潮汐の影響を均一にするにはどうすればよいでしょうか? # # # 最低低潮面(最低水面)を基準にする式として # # h=(h1 + h2)/2 + (h1 - h2)/2cos{(T - T1)/(T2 - T1) π} # # h:調査時刻における潮位(cm) # h1、h2:調査時刻をはさむ満潮、干潮の潮位(cm) # T:調査時刻(分) # T1、T2:h1、h2に対応する時刻(分) # # として、求めたい水深をdとし、計測した水深をaとし # d = a - h f(_h1,_h2,_T,_T1,_T2,_h) :- _h is (_h1+_h2)/2 + (_h1-_h2)/(2*cos((_T-_T1)/(_T2-_T1)*pi)). 'ある湾の水深をロープで測って時間と共に潮汐の影響を均一にして、水深を記録する'(_測定した水深,_調査時刻をはさむ満潮潮位,_調査時刻をはさむ干潮潮位,_調査時刻,_調査時刻をはさむ満潮時刻,_調査時刻をはさむ干潮時刻,_求める水深) :- '求めたい水深をdとし、計測した水深をaとし'(_測定した水深,_調査時刻をはさむ満潮潮位,_調査時刻をはさむ干潮潮位,_調査時刻,_調査時刻をはさむ満潮時刻,_調査時刻をはさむ干潮時刻,_求める水深). '求めたい水深をdとし、計測した水深をaとし'(_a,_h1,_h2,_T,_T1,_T2,_d) :- f(_h1,_h2,_T,_T1,_T2,_h), _d is _a - _h,!. % 以下のサイトは # 出典: C/C++の宿題片付けます 150代目 #353 # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク): #   #  円周率を求めよ。方法はどのような方法でも構わない。 #  ただしprintf("%f",M_PI)などはなし。 #  またアルゴリズムのオリジナリティは評価に加点します。 #  (〜の方法では◯桁までしかでないが、このアルゴリズムを追加すると #   桁数が増える など) # #  できるだけ多い桁数を出したいです。 #  また桁数を逐次的に増やす方法が知りたいです。 # #  よろしくお願いします # 相加相乗平均による円周率の算出 :- 相加相乗平均による円周率の算出(_円周率), format('~11f',[_円周率]). 相加相乗平均による円周率の算出(_円周率) :- length(Ln,8), _b is 1 / sqrt(2.0), 相加相乗平均による円周率の算出(Ln,1,_b,1,4,_,_円周率). 相加相乗平均による円周率の算出([],_,_,_,_,_円周率,_円周率) :- !. 相加相乗平均による円周率の算出([_|Ln],_a,_b,_s,_t,_円周率_1,_円周率) :- _a_2 is (_a + _b) / 2, _b_2 is sqrt(_a * _b), _s_2 is _s - _t * (_a_2 - _a) * (_a_2 - _a), _t_2 is _t * 2, _円周率_2 is (_a_2 + _b_2) * (_a_2 + _b_2) / _s_2, 相加相乗平均による円周率の算出(Ln,_a_2,_b_2,_s_2,_t_2,_円周率_2,_円周率). % 以下のサイトは # [1] 授業単元: プログラミング # [2] rand()を使い、モンテカルロ法により円周率を求めるプログラムを作る。 #    具体的な手順として #     ・0から1の乱数2つをペアにし、片方をx座標、もう1方をyとする。 #     ・乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える #     ・1:π/4 = n:r から π = 4*r/n  #      この式に従いπを計算する。 #    参考として #     ・rand()でx座標とy座標を求める #       x=(double)rand()/RAND_MAX; # y=(double)rand()/RAND_MAX; # ・その点の原点からの距離rを計算する #       r=x*x+y*y #     ・For分で点の発生を繰り返す #     ・点が円の内側か外側かを判定し、内側ならカウンタの変数を1増やす #      (演算子++を使う) #  っていうのが問題です。 試行回数(1000). モンテカルロ法により円周率を求める(_円周率) :- 試行回数(_n), '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(_n,_x,_y,_r), _円周率 is 4 * _r / _n. '0から1の乱数2つをペアにし、片方をx座標、もう1方をyとする'(_x,_y) :- _x is rand(1001) / 1000, _y is rand(1001) / 1000,!. '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(0,0) :- !. '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(_n,_r) :- '0から1の乱数2つをペアにし、片方をx座標、もう1方をyとする'(_x,_y), ピタゴラスの定理を使って座標点が円の内部であるか判定する(_x,_y), _n_1 is _n - 1, '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(_n_1,_r_1), _r is _r_1 + 1,!. '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(_n,_r) :- _n_1 is _n - 1, '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(_n_1,_r). ピタゴラスの定理を使って座標点が円の内部であるか判定する(_x,_y) :- 1.0 >= _x * _x + _y * _Y. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/296 # # [1] 授業単元: Cプログラミング # [2] 問題文(含コード&リンク): 中心座標(1.0 , 2.5)、半径 5.0 の円軌道上に存在する全ての x,y 座標を ”circle.csv”へ出力せよ。 # 尚、ラジアンの刻み幅は 0.01 ,π= 3.14 とする。また、csvファイルをExcelで開き、グラフで図形を確認すること。 # # X=5.0 * Sin(rad) + 1.0 # Y=5 * Cos(rad) + 2.5 # [ 0 ≦ rad < 2π ] # # '中心座標(1.0 , 2.5)、半径 5.0 の円軌道上に存在する全ての x,y 座標を ”circle.csv”へ出力する'(L) :- '中心座標(1.0 , 2.5)、半径 5.0 の円軌道上に存在する全ての x,y 座標'(0.0,L), '"circle.csv"へ出力する'(L). '中心座標(1.0 , 2.5)、半径 5.0 の円軌道上に存在する全ての x,y 座標'(Radian,[]) :- Radian >= 2 * pi,!. '中心座標(1.0 , 2.5)、半径 5.0 の円軌道上に存在する全ての x,y 座標'(Radian,[[X,Y]|R]) :- 円軌道上の点(Radian,X,Y), Radian2 is Radian + 0.1, '中心座標(1.0 , 2.5)、半径 5.0 の円軌道上に存在する全ての x,y 座標'(Radian2,R). 円軌道上の点(Radian,X,Y) :- X is 5.0 * sin(Radian) + 1.0, Y is 5.0 * cos(Radian) + 2.5,!. '"circle.csv"へ出力する'(L) :- concat_atom(L,',',S), open('circle.csv',write,Outstream), write(Outstream,S), close(Outstream). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/847 # # [1] 授業単元:C++ # [2] 問題文(含コード&リンク):1辺の長さが2の正方形の中に半径1の円形の標的がある。この板に向かってランダムに弾を撃って、標的に # が入ったか否かを調べることで円周率を求める(モンテカルロ法)プログラムを作りなさい。 # 撃った弾の数をx、命中した数をyとする。 # '1辺の長さが2の正方形の中に半径1の円形の標的がある。この板に向かってランダムに弾を撃って、標的にが入ったか否かを調べることで円周率を求める(モンテカルロ法)'(_円周率) :- count(( for(1,_,100000), _x is ((random mod 20001) - 10000) / 10000, _y is ((random mod 20001) - 10000) / 10000, 1.0 >= sqrt((_x ^ 2) + (_y ^ 2))), Count), _円周率 is (Count / 100000) * 4. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/678 # # 0〜2πまで、π/100おきに、sin/cos/tanの値を表示するプログラムです。 # http://ime.nu/codepad.org/Jl9uLX3vのプログラムを作成しましたが、0からでなく途中からしか表示されません。 # 教えてください。 # '0〜2πまで、π/100おきに、sin/cos/tanの値を表示する' :- '0〜2πまで、π/100おきに、sin/cos/tanの値を表示する'(0.0). '0〜2πまで、π/100おきに、sin/cos/tanの値を表示する'(_x) :- _x > 2 * pi,!. '0〜2πまで、π/100おきに、sin/cos/tanの値を表示する'(_x) :- _sinX is sin(_x), _cosX is cos(_x), _tanX is tan(_x), write_formatted('%tの値は\nsin(%t) = %t\ncos(%t) = %t\ntan(%t) = %t\n',[_x,_x,_sinX,_x,_cosX,_x,_tanX]), _x_2 is _x + pi / 10, '0〜2πまで、π/100おきに、sin/cos/tanの値を表示する'(_x_2) . % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/483 # # [1] 授業単元:数値計算 # [2] ∫_0^π?sinxdxにおいて2m=4とし、 10分割した際の数値積分をシンプソンの公式により求めなさい # f(X,Y) :- Y is sin(X). '10分割した際の数値積分をシンプソンの公式により求める'(_定積分の近似値) :- シンプソンの公式(10,0,pi,_定積分の近似値). シンプソンの公式(_分割数,_a,_b,_定積分の近似値) :- _h is ( _b - _a) / (2 * _分割数), _m is _n - 1, findsum(S,( for(0,_i,_m), f(_a+(2*_i)*_h,Y1), f(_a+(2*_i+1)*_h,Y2), f(_a+(2*_i+2)*_h,Y3), S is Y1 + 4 * Y2 + Y3), Sum), _定積分の近似値 is (_h / 3) * Sum. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/330 # # 始めたばかりで何が何だかわかりません… # # [1] 授業単元:メディア基礎 # [2] 問題文(含コード&リンク):数式X=[{16/(k*π)^2}^2]がある。 # kが整数1〜30の時のXの値をそれぞれ出力するプログラムをCで書きなさい。 # 数式(_k,X) :- X is (16 / (_k * pi) ^ 2) ^ 2. '数式X=[{16/(k*π)^2}^2]がある。 kが整数1〜30の時のXの値をそれぞれ出力する' :- for(1,_k,30), 数式(_k,X), write_formatted('%2d, %.12f\n',[_k,X]), _k = 30. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/501 # # [1] 授業単元:C言語入門 # [2] 問題文(含コード&リンク): # 次式の値を返す関数を作成せよ。 # f(x)=e^{-x} cos(2πx) # その関数を用いて0≦x≦3の間で0.1刻みで計算し、結果をリダイレクトで # ファイルに記録せよ。その結果をgnuplotでグラフにして示せ。 # # 次式の値を返す関数を作成せよ。 # f(x)=e^{-x} cos(2πx) # その関数を用いて0≦x≦3の間で0.1刻みで計算し、結果をリダイレクトで # ファイルに記録せよ。その結果をgnuplotでグラフにして示せ。 [root]# prolog -c temp.pro >temp.txt % temp.pro program :- 'c137_501:f(x)=e^{-x} cos(2πx) その関数を用いて0≦x≦3の間で0.1刻みで計算'. 'c137_501:f(x)=e^{-x} cos(2πx) その関数を用いて0≦x≦3の間で0.1刻みで計算' :- M is truncate((3 - 0) / 0.1), for(0,N,M), _x is N * 0.1, Y is exp(1) ^ (-1 * _x) * cos(2 * pi * _x), write_formatted('%t\n',[Y]), N = M . % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/409 # # [1] 授業単元:プログラミングC # [2] 問題文(含コード&リンク): # 極座標(r,θ)の値を入力すると、直交座標(x,y)に変換するプログラムを作成せよ。 # 但し,θの値はdegree(度)で入力すること。また、πの値は逆三角関数(arctan(x))を使って計算をすること。 # '極座標(r,θ)の値を入力すると、直交座標(x,y)に変換する'(_r,_θ,_x,_y) :- _x is _r * cos(4 * atan(1) * _θ / 180), _y is _r * sin(4 * atan(1) * _θ / 180). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/190 # # モンテカルロ法で√2の近似値を求めたいのですが、 # ネット調べてみるとモンテカルロ法と言えばπの近似に関するばかりで・・・ # どなたか教えてくださいませ # # モンテカルロ法で√2の近似値を求める(_試行回数,_除数,X) :- count((for(1,N,_試行回数),U is (random mod _除数) ^ 2,U < _除数 * _除数 / 2),Y), X is Y / (_試行回数 / 2). % 以下のサイトは # 出典: C/C++の宿題片付けます 136代目 #874 # [1] 授業単元:C言語プログラミング # [2] 問題文(含コード&リンク):モンテカルロ法で円周率を求めるプログラムを作れ。 # モンテカルロ法で円周率を求める(_試行数,_円周率) :- '正方形の中に適当に点を打つとき、その点が正方形の一辺を直径とする円の円内にある数'(_試行数,_円内にある数), _円周率 is (_円内にある数 * 4) / _試行数. '正方形の中に適当に点を打つとき、その点が正方形の一辺を直径とする円の円内にある数'(_試行数,_円内にある数) :- count((for(1,N,_試行数),落ちた点は円内にある),_円内にある数). 落ちた点は円内にある :- '落ちた点と原点の距離が辺の長さ(1.0)以内'. '落ちた点と原点の距離が辺の長さ(1.0)以内' :- X is ((random mod 2001) - 1000) / 1000, Y is ((random mod 2001) - 1000) / 1000, X * X + Y * Y =< 1.0,!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/110 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク):(1)x^2*cosx の0〜π/2までの積分 (2)(logx)^2 # の1〜eまでの積分 # シンプソンの公式([],H,S1,S) :- S is S1 * H / 3,!. シンプソンの公式([A,B,C|R],H,S1,S) :- S2 is S1 + A + 4 * B + C, シンプソンの公式([C|R],H,S2,S). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% f(X,Y) :- Y is X^2 * cos(X). '等間隔シンプソン法を使ってx^2*cosx の0〜π/2までの積分'(_標本点数,_面積) :- 標本点数は3以上の奇数である(_標本点数), 刻みは(_標本点数,_刻み), 標本点ならびを得る(_標本点数,_刻み,_等間隔標本点データならび), シンプソンの公式(_等間隔標本点データならび,_刻み,0,_面積). 標本点数は3以上の奇数である(_標本点数) :- _標本点数 >= 3,1 is _標本点数 mod 2. 刻みは(_標本点数,_刻み) :- _刻み is (pai / 2 - 0) / (_標本点数 - 1). 標本点ならびを得る(_標本点数,_刻み,_等間隔標本点データならび) :- findall(Y,(for(1,M,_標本点数),X is 0 + (M - 1) * _刻み,f(X,Y)),_等間隔標本点データならび),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% f(X,Y) :- Y is log(X) ^ 2. '等間隔シンプソン法を使って(logx)^2の1〜eまでの積分'(_標本点数,_面積) :- 標本点数は3以上の奇数である(_標本点数), 刻みは(_標本点数,_刻み), 標本点ならびを得る(_標本点数,_刻み,_等間隔標本点データならび), シンプソンの公式(_等間隔標本点データならび,_刻み,0,_面積). 標本点数は3以上の奇数である(_標本点数) :- _標本点数 >= 3,1 is _標本点数 mod 2. 刻みは(_標本点数,_刻み) :- _刻み is (exp(1) - 1) / (_標本点数 - 1). 標本点ならびを得る(_標本点数,_刻み,_等間隔標本点データならび) :- findall(Y,(for(1,M,_標本点数),X is 1 + (M - 1) * _刻み,f(X,Y)),_等間隔標本点データならび),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/818 # # [1] 授業単元:ソフトウェア演習 # [2] 問題文(含コード&リンク): # # 直角三角形の3辺a,b,cのa,bの長さが与えられたときCの長さを返す関数のプログラム、 # 角度0〜180の値を与えるラジアンに変換した値、sinの値、cosの値を返す関数のプログラムをひとつのプログラムで行う。 # π=3.141592 # # '直角三角形の3辺a,b,cのa,bの長さが与えられたときCの長さを返す'(A,B,C) :- A == B, C is sqrt(A ^ 2 + B ^ 2). '直角三角形の3辺a,b,cのa,bの長さが与えられたときCの長さを返す'(A,B,C) :- B > A, C is sqrt(B ^ 2 + A ^ 2). '直角三角形の3辺a,b,cのa,bの長さが与えられたときCの長さを返す'(A,B,C) :- B > A, C is sqrt(B ^ 2 - A ^ 2). '直角三角形の3辺a,b,cのa,bの長さが与えられたときCの長さを返す'(A,B,C) :- A > B, C is sqrt(A ^ 2 + B ^ 2). '直角三角形の3辺a,b,cのa,bの長さが与えられたときCの長さを返す'(A,B,C) :- A > B, C is sqrt(A ^ 2 - B ^ 2). ラジアン値(_角度0〜180,_ラジアン値) :- _ラジアン値 is pi * _角度0〜180 / 180. sin(_角度0〜180,Sin値) :- ラジアン値(_角度0〜180,_ラジアン値),Sin値 is sin(_ラジアン値). cos(_角度0〜180,Cos値) :- ラジアン値(_角度0〜180,_ラジアン値),Cos値 is cos(_ラジアン値). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/607 # # [1] 授業単元: C言語 # [2] 問題文: # (1)\int_0^π/2 f(x^2cosx)dx # (0からπ/2までのf=x^2cosxの定積分) # (2)\int_1^e f(logx)^2dx #  (1からeまでの(logx)の二乗の定積分) # (1),(2) の積分を実施する。 # % (1) シンプソンの公式は http://nojiriko.asia/prolog/t540.html 参照 f(X,Y) :- Y is (X ^ 2) * cos(X). '0からπ/2までのf=x^2cosxの定積分'(M,S) :- P2 is pi / 2, シンプソンの公式(0,P2,M,S). % (2) シンプソンの公式は http://nojiriko.asia/prolog/t540.html 参照 f(X,Y) :- Y is (log(X) ^ 2). '1からeまでの(logx)の二乗の定積分'(M,S) :- E is exp(1), シンプソンの公式(1,E,M,S). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/753 # # [1] 授業単元: プログラミング # [2]問題文: # モンテカルロ法による円周率の近似値の計算を行うプログラムを書け。 # 生成する点の個数はキーボードから受け取るようにせよ。 # 乱数の生成にはMersenne twisterを用いよ。 # モンテカルロ法で円周率を計算する(_円周率) :- モンテカルロ法で円周率を計算する(1,10000,0,_円周率),!. モンテカルロ法で円周率を計算する(M,N,Y,X) :- M > N,X is 4.0 * Y / N,!. モンテカルロ法で円周率を計算する(M,N,Y,X) :- U1 is ((random mod 10000) / 10000) ^ 2, U2 is ((random mod 10000) / 10000) ^ 2, U1 + U2 =< 1.0, Y2 is Y + 1, M2 is M + 1, モンテカルロ法で円周率を計算する(M2,N,Y2,X),!. モンテカルロ法で円周率を計算する(M,N,Y,X) :- M2 is M + 1, モンテカルロ法で円周率を計算する(M2,N,Y,X),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/557 # # [1] 授業単元: 情報数学 # [2] 問題文(含コード&リンク): # オイラー級数を用いて、πの近似値を求めよ。 オイラー級数を用いて、πの近似値を求める(_円周率) :-   findsum(U,(for(1,N,100000),U is 1 / (N * N)),Sum),   _円周率 is sqrt(6 * Sum). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/890 # # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク): # sinxをテイラー展開しn項目で打ち切ったものについて # xについては0から2πまでの範囲を0.05π刻みでけいさんし、nについてはn=1,2,3,4(すなわち3次、5次、7次、9次までの展開)について計算し # x   sinx 3次まで ・・・・・9次まで # 0.0 … # 0.157 … # のような数表を自分で指定したファイルに出力するプログラムを作成しなさい。 # 'sin(X)をテイラー展開'(_ファイル名) :- tell(_ファイル名), テイラー展開(0.0), told. テイラー展開(F) :- F > 2 * pi,!. テイラー展開(F) :- Y is sin(F),write_formatted('%5.3f %8.7f ',[F,Y]),fail. テイラー展開(F) :- for(1,N,4),テイラー展開(sin(F),N,Y),write_formatted('%8.7f ',[Y]),N=4, write('\n'), F2 is F + pi * 0.05, テイラー展開(F2). テイラー展開(sin(X),N,Y) :- findsum(Z,(for(0,M,N),テイラー展開の二(sin(X),M,Z)),Y). テイラー展開の二(sin(X),N,Y) :- U is 2 * N + 1, 階乗(U,U2), Y is (((-1) ^ N) / U2) * (X ^ (2 * N + 1)). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1197620454/434 # # 問題文 # モンテカルロ法による円周率 # 1×1の正方形と1/4円を用いて円周率を求めるプログラムを作成したい # なお、関係式、及び正方形と1/4円の図は以下の様になる # π/4:1 = P : P + Q # π = 4P/P + Q = 4P/N # πは円周率、Pは円外にある点の数、NはP + Qとする モンテカルロ法により円周率を求める(N,Pi) :- モンテカルロ法により円周率を求める(0,N,0,H), P is H / N, Pi is 4 * Pi, write_formatted('Pi = %t\n',[Pi]). モンテカルロ法により円周率を求める(M,N,H,H) :- M > N,!. モンテカルロ法により円周率を求める(M,N,H1,H) :- X1 is (random mod 7717) / 7717, Y1 is (random mod 7717) / 7717, U is X * X + Y * Y, '1に収まっていればカウント'(U,H1,H2), M2 is M + 1, モンテカルロ法により円周率を求める(M,N,H2,H). '1に収まっていればカウント'(U,H1,H2) :- U < 1, H2 is H1 + 1,!. '1に収まっていればカウント'(U,H1,H1). % 以下のサイトは # 出典:: 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). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1257481818/90 # # 始点 # x=cos(t) # y=sin(t) # # 終点 # x=cos(t+dt) # y=sin(t+dt) # # で線を描き、t=t+dtで疑似円を描いています。 # # 長方形や楕円を、任意の角度に傾けるにはどのようにすれば良いのでしょうか? # 疑似円を描く(_半径) :- 疑似円座標をならびに得る(_半径,L), 疑似円を描く(L). 疑似円を描く([[X1,Y1],[X2,Y2]]) :- 線分の描写(X1,Y1,X2,Y2). 疑似円を描く([[X1,Y1],[X2,Y2]|R]) :- 線分の描写(X1,Y1,X2,Y2), 疑似円を描く(R). 疑似円座標をならびに得る(_半径,L) :- _2π is 2 * pi, _dt is _2π / 100, 疑似円座標をならびに得る(0.0,_2π,_dt,_半径,L). 疑似円座標をならびに得る(_t_1,_t_2,_dt,_,[]) :- _t_1 > _t_2,!. 疑似円座標をならびに得る(_t_1,_t_2,_dt,_半径,[[X,Y]|R]) :- X is _半径 * cos(_t_1), Y is _半径 * sin(_t_1), _t_3 is t_1 + _dt, 疑似円座標をならびに得る(_t_3,_t_2,_dt,_半径,R). /* ここも直しました *