simpson(0,1,1000) => (0.039428039133911824+0.0003325003552482901i)というようになった。 しかし、for文のiをjに変え、2jのようにかくと、エラーになった。 これらのことから、プログラムで2iのようにかくとiは虚数として扱われるとして理解して良いのでしょうか?
irb(main):026:0> (PI/4 - montecarlo(100000)).abs() => 4.183660255174804e-05のような値が出たことがあるのだが、これはどういう意味だろうか。
4.183660255174804e-05というのは、
4.183660255174804 * (10 ** -5)を意味しています。この表記法は「科学的表記法」と呼ばれて多くのプログラミング言語で用いられています.「e」は指数部(exponent)の頭文字からきていて,大文字の「E」も用いられます.
for (i = 0; i < 10; i++){ ... }と書くように、初期化文、条件文、再初期化文を書かないといけない言語もありますが、rubyやpythonなどの言語はこのように構文が簡単化されています。 for i in ... という構文は...のそれぞれの要素を順にiに割り当ててループを実行していくという意味なので、 for i in 0..10 のようなrangeによる指定以外にもfor i in ["a","b","c"] のような形で配列を使って書くことでできます。
irb(main):002:0> x = 4 => 4 irb(main):003:0> x / 3.0 => 1.3333333333333333 irb(main):004:0> x / 3 => 1のように,被除数が整数の時は3.0で割るのと3で割るのを区別することに 意味があります.ただし,このプログラムでは,
deltax=(xe-xs)*0.5/nを実行しているため,deltaxは実数データで表現されると見なされ,deltax * sum も実数データと見なされています.したがって,3.0の代わりに3と書いても結果は同じになります.それでも 3.0 と書いているのは「ここでの除算は余りのない除算でおこなう」ことを明示的に表すためだと思います.
def simpson(xs,xe,n) deltax = (xe-xs)*0.5/n sum = f(xs)+f(xe)+4*f(xs+deltax) for i in 1..(n-1) sum = sum + 2 * f(xs+2*i*deltax) + 4 * f( xs + (2*i + 1) * deltax) end deltax * sum / 3.0 endなお,
sum = 0 for i in 0..(n-1) sum = sum + f(xs+2*i*deltax) + 4 * f(xs+(2*i+1)*deltax ) +f(xs+(2*i+2)*deltax) endと書いても結果は同じになるのではないかと書いた人もいました.たしかに その通りで,直感的にも理解しやすいのですが,f(xs+(2*i+2)*deltax) の計算は,iを1増やした時のf(xs+2*i*deltax)と同じになるので,同じ計算を2回おこなうことになります.これを省略するために,教科書にあるような式で計算します.
mkdir algo16のようにします.そして,ターミナルを開くたびに
cd algo16と入力してからirbを動かしてください.詳しくは,はいぱーワークブック「14.4 コマンドを使ったファイル操作」を参照してください.
cd algo16 unzip allcode.zipを実行するか,Finderでalgo16のフォルダの下のallcode.zipをダブルクリックすると,algo16の下にすべての配付プログラムが展開されます.
cd algo16を済ませてから,
ruby vote.rb 選択肢番号のように使います.
irbを使いながら(一旦終了せずに),投票システムも使うには,ターミナルのメニューバーの「シェル」->「新規タブ」を選ぶか,[Command]+[T]で別のタブを開いて(あるいは[Command]+[N]で別のウィンドウを開いて),投票システムを使うことをお勧めします.このあたりのことは,「はいぱーワークブック」の15.4 ターミナルの便利な使い方に書いてあるので参考にしてください.
irb(main):003:0> a = 0.5 => 0.5 irb(main):004:0> printf("%064b\n",[a].pack("E").unpack("Q")[0]) 0011111111100000000000000000000000000000000000000000000000000000 => nil逆の変換は以下のようにやる.
b = "0011111111100000000000000000000000000000000000000000000000000000" [b.to_i(2)].pack("Q").unpack("E")単精度表現は
irb(main):005:0> printf("%032b\n",[0.5].pack("e").unpack("L")[0]) 00111111000000000000000000000000 => nilと
irb(main):006:0> ["00111111000000000000000000000000".to_i(2)].pack("L").unpack("e") => [0.5]
isrb(main):004:0> Dir.chdir("./algo16")のように,Dirクラスのchdirメソッドを使うと良いようです.Windows版のisrbで起動後にカレントディレクトリが変わってしまうという症状が出る場合は,これで対応できます.
cd ~/algo16と入力してください.これらの機能を使うと,irbを抜けずにvoteできます.
ターミナルの基本的な使い方は,はいぱーワークブックの15.2 ターミナルの基本的な使い方を,より高度な使い方は,15.4 ターミナルの便利な使い方を参照してください.
cdというコマンドと「~」の意味は,はいぱーワークブックの14.4 コマンドを使ったファイル操作の14.4.1 ディレクトリを読むと分かります.
iruby notebookを実行すると,Webブラウザ上で対応するタブが開きます.
include(Math)を入力するように書いています. 毎回入力するのが面倒な場合は,ホームディレクトリの下に「.irbrc」というテキストファイルを作り,その中に
include(Math)と書いておくと,irb起動時にこのファイルの中身を実行してくれるので,毎回指定しなくても大丈夫です.ただし,このファイルの実行中にエラーが出ないように正しく記述剃る必要があります.また,
Math.sqrt(2)のような形で指定すれば,
include(Math)は不要です.
cp -rp /home/5320954122/Ruby ~/Library/Application\ Support/mi/mode/を実行してからmiを立ち上げるとRubyモードが利用可能なモードとして加わります.
の画面が出るので,モードを「Ruby」にして,改行コードを「LF(UNIX)」にして,ウィンドウを閉じてください.以降は,ファイル作成のさいに,「ファイル」->「新規」->「Ruby」で作成すると正しい改行コードが設定されているはずです.
ruby check.rb ex01.rbと実行すると,関数を与えた時の入力と出力があっていることが確認できます. 詳しくは,補足説明 (練習問題確認プログラムの使い方)を御覧ください.