Octave教科書2009-07-20 13:00

x の x 乗根
副題 オープンソースの数値計算システム
著者 赤間世紀
発行 工学社 2007-12-01 1版1刷
価格 1,900+税
ISBN978-4-7775-1326-0

Maxima なんかが数式処理システムなのに対して、Octave は数値計算システムです。私なんかは電卓代わりによく irb (Ruby の対話システム) を使いますが、Octave を電卓として使っていると "include Math" しなくていいし(!)、グラフ化もすぐにできてうれしいです。
本の内容としてはインストール法から始めて、グラフの出し方、プログラミング(できるんだ!)、Octave の得意とする行列計算のやり方を例題を示しながら進めていきます。

前回、「へんな数式美術館」で触れた e の e 乗根に関連して、x の x 乗根をグラフ化すると以下のようになります。e の e 乗根が極大になっているのがわかると思います。(上の画像は結果)

> x=linspace(0.1,10,200)
> y=power(x,1./x)
> plot(x,y)

へんな数式美術館2009-07-18 01:43

副題 世界を表すミョーな数式の数々
著者 竹内薫
発行 技術評論社 2008-08-05 1版1刷
価格 1,580+税
ISBN978-4-7741-3556-4

なんか最近、竹内薫さんの解説本を読む機会が多い気がする。
ちなみこの本、自分にとっては 30年前の高校の頃を思い出させてくれたという意味でヒットです。

自分の高校の頃といえば、なぜか「同じ演算の繰り返し」に興味がありました。P.124 「黄金比」は Ruby を使えば以下のようになります。

まず、繰り返し関数 rp を定義します。fn は目的の演算、x は初期値、n は繰り返し回数です。"include Math" はあとで定数を使うため。

include Math
def rp(fn, x, n)
 if n <= 0
  return x
 else
  return fn.call(x, rp(fn, x, n - 1))
 end
end

fun = "lambda{|a, b| a + ( 1 / b)}"
x = 1.0
n = 15
printf("rp(%s, %f, %d) = %f\n", fun, x, n, rp(eval(fun), x, n))
結果
rp(lambda{|a, b| a + ( 1 / b)}, 1.000000, 15) = 1.618034

P.154「無限の不思議」は前出の rp を使って以下のようになります。

fun = "lambda{|a, b| a ** b}"
x = 2 ** 0.5 # ルート 2
n = 38
printf("rp(%s, %f, %d) = %f\n", fun, x, n, rp(eval(fun), x, n))
結果
rp(lambda{|a, b| a ** b}, 1.414214, 38) = 2.000000

ここで 「ルート 2 の x 乗 = x」とすれば、x = 2 または x = 4 となる。しかし、x = 4 は捨てられる。本にはその理由が書かれていないけれど、なぜかと言えば収束するのが べき乗される側が e の e 乗根までだからである。
その e の e 乗根までなら収束する証明を高校のころしたような気がするけれど詳細が思い出せない。進路指導に忙しい担任の数学教師に「役に立たない」呼ばわりされたような気もするけど、習いたての部分積分かなんかを使った気がする。

とりあえず、e の e乗根が繰り返し乗演算されて e に近づいていく様子は下のようになる。

fun = "lambda{|a, b| a ** b}"
x = E ** (1 / E) # e の e 乗根
n = 100000
printf(" e = %f\n", E)
printf("rp(%s, %f, %d) = %f\n", fun, x, n, rp(eval(fun), x, n))
結果
                        e = 2.718282
rp(lambda{|a, b| a ** b}, 1.444668, 1000) = 2.718227

ブログでは全角スペースとかが入っていて Ruby をコピペで動かすには工夫がいるかも。そのため以下にもソースは置いときます。
http://www.taifu.jp/svn/mole/trunk/math/rp.rb




# "molt" ←ぜんぜん更新してない