12/12 数値計算(2)


前回の感想,質問より

Q.
def difference_m(n)
 if 0.785398163397448-montecarlo(n)>0
  0.785398163397448-montecarlo(n)<10**(-3) 
 else
  montecarlo(n)-0.785398163397448<10**(-3)
 end
end
として、trueが出るか試しました。n=100でも何回もやると、trueが返されたので、1と答えたましたが、適当にやったと先生はおっしゃいました。

何が間違っているのでしょうか?

A.
「いいかげんに答えた」という発言は取り消します.ただ,上のプログラムは,montecarlo(n)の呼び出し結果 が,毎回違っているということを考慮していないので,正しくない結果になっています.たとえば,
 if 0.785398163397448-montecarlo(n)>0
の実行時に montecarlo(n)が0.75を返し,
  0.785398163397448-montecarlo(n)<10**(-3) 
の実行時に,montecarlo(n)が0.80を返した場合は,どちらも誤差が10-3よりも大きい場合でも,trueを返し ます.
Q.
simpson.rbがloadできませんでした・・・
irb(main):003:0> load("./simpson.rb")
SyntaxError: ./simpson.rb:7: Invalid char `\343' in expression
./simpson.rb:7: Invalid char `\200' in expression
./simpson.rb:7: Invalid char `\200' in expression
....(略)
./simpson.rb:12: Invalid char `\343' in expression
./simpson.rb:12: Invalid char `\200' in expression
./simpson.rb:12: Invalid char `\200' in expression
from (irb):3:in `load'
エラーの意味が分かりませんでしたorz
A.
これは見つけにくいエラーですね.
 SyntaxError: ./simpson.rb:7: Invalid char `\343' in expression
 ./simpson.rb:7: Invalid char `\200' in expression
 ./simpson.rb:7: Invalid char `\200' in expression
この\343, \200, \200は1バイトを8進数で表現したもので,この3バイトの列は日本語入力モードの時に,スペースキーを押して入力される,「いわゆる全角スペース」の文字コードに対応しています.これを普通のスペースに置き換えれば動くはずです.
Q.
Mathematicaというとても便利なソフトがあることを知ったのでこれから使っていこうと思う。
A.
Mathematicaは個人で買うとかなり高いソフトウェアですが,教育用計算機システム内ではMac環境, Windows環境のどちらでも使えるので,是非利用してください. 無料の数式処理ソフトとしては,Sage( http://sagemath.org )がありますが,Windowsではそれほど インストールしやすくないようですね.
Q.
 irb(main):201:0> 01111110
 => 299592
となってしまったのはなぜでしょうか。
A.
Rubyでは0で始めると8進数だと解釈されてしまいます.そのため,この例では,
 irb(main):005:0> 8**6+8**5+8**4+8**3+8**2+8**1 
 => 299592
と解釈されたのです.間違えやすい仕様ですね.
Q.
乱数の周期を大きくするためにはどのような手法がありますか。 あと、乱数列の最初のm個はどのように決めているのですか。 実際に使われている疑似乱数列はどのくらいの周期になっていますか。
A.
線形合同法のような単純な疑似乱数生成アルゴリズムで「乱数の周期を大きくするためには」ことを試みるのではなく,「乱数の周期が大きいことが保証されている」疑似乱数生成アルゴリズムを使います.たとえば,よく使われるメルセンヌ・ツイスタ(MT19937,現東京大学大学院数理科学研究科 松本眞教授らが作成)という疑似乱数生成生成アルゴリズムの周期は 2**19937-1 という実用的には十分長い周期を持っています.

乱数列の最初のm個は実行した時刻など,滅多に重ならないものを使うことが多いのですが,熱雑音等の物理現象に基づく真の乱数を使うこともあります.


Q.
f(x)を後から入力できるように工夫しようとしましたが、結局できませんでした。
A.
この講義の範囲は完全に超えてしまうのですが,
 def simpson(xs,xe,n,&func)
   deltax=(xe-xs)*0.5/n
   sum=func.call(xs)+func.call(xe)+4*func.call(xs+deltax)
   for i in 1..(n-1)
     sum=sum+2*func.call(xs+2*i*deltax)+4*func.call(xs+(2*i+1)*deltax)
   end
   sum*deltax/3.0
 end
のように定義すると,
 irb(main):015:0> simpson(0,1,100) {|x| x**2+1}
 => 1.33333333333333
のようにして,関数の部分をその場で与えることができます.

前回の課題について


投票システム

vote.rbをダウンロードして,ホームディレクトリに保存してください.ドックからターミナルを起動して,
ruby vote.rb 選択肢番号
のように使います.

今日の練習,投票

関連リンク


教科書の補足


今日の課題