Newton法による平方根

1.1.7 Newton法による平方根

これって動くのかな。


(define (square x) (* x x))

(define (sqrt-iter guess x)
(if (good-enough? guess x)
guess
(sqrt-iter (improve guess x)
x)))

(define (improve guess x)
(average guess (/ x guess)))

(define (average x y)
(/ (+ x y) 2))

(define (good-enough? guess x)
(< (abs (-(square guess) x)) 0.001))

(define (sqrt x)
(sqrt-iter 1.0 x))

(sqrt 9)

reference to undefined identifier: square
「square」が無いってさ。
→追加。(上には追加してある)

おぉぉ、、動いたっ。

3.00009155413138

すげぇな。すごくないのか?すごいよね?
なんだろう、会話するみたいにプログラムが出来ちゃってるね。
「?」も関数名に含めて良いってのが凄いのかな。

前に作った関数がすでにそこにあるかのごとく説明してるところも凄いよね?
squareなんていつ作ったよ。みたいな。
無ければ付け足してってことなのか、環境によっては一度作った関数は
常に使えるのか、、よく分からないが。

absって何だろう→絶対値を返すらしい。てか前にやってた。

問題1.6

Alyssaさんがcondを使用して「if」を再定義したらしい。


(define (new-if predicate then-clause else-clause)
(cond (predicate then-clause)
(else else-clause)))

なにが起こるのか・・・。ん〜。
「if」と「new-if」の違いかぁ。

ifは(if P THEN ELSE)だよな。
new-ifもぱっと見同じだよな。でも違うから問題にしてるんだろうな。

色々検索してみて気になった文章


predicate の真偽によって then-clause か else-clause そのものを返す.
元々の if では then-clause か else-clause を評価した値を返す.
これかな。
「cond」は式を返却するけど「if」は評価した値を返すってことらしい。
つまりelse部分が無限ループに陥る。


Gauche+slibでトレースとか良いなぁと思って
でもubuntu入れるのはめんどうくさくて
eclipseプラグインでできるかなって思って
cuspとschemewayを試してみて。だめで。
あっちこっちいじってたらeclipseがおかしくなって。。
もうだめだ。Schemeの勉強終わったらubuntu入れようかなぁ。

ってmomongaでgauche動いたわ。
インストールできたのかな。。汗。。なんでだ。なにしたオレ。。
いじりすぎて何したか全然分からないけど、そんな自分が結構好き。
ちょっと触ってみないとな。
あ、でもcoLinuxWindows間でコピペできねぇ。

う〜ん。

問題1.7

許容値より小さい値の平方根が取れない気はするけど
大きすぎる値の場合はこれといって問題がわからない。


小さい数字
(sqrt 0.1)
(* (sqrt 0.1) (sqrt 0.1))
(sqrt 0.01)
(* (sqrt 0.01) (sqrt 0.01))
(sqrt 0.001)
(* (sqrt 0.001) (sqrt 0.001))
(sqrt 0.0001)
(* (sqrt 0.0001) (sqrt 0.0001))

0.316245562280389
0.10001125566203942
0.10032578510960605
0.01006526315785885
0.04124542607499115
0.0017011851721075596
0.03230844833048122
0.0010438358335233748

小さくても別に問題なさそう・・・あ、あれ?
ダメだね。0.0001が全然ダメみたい。ほほぅ。

・・じゃ、大きい数字
(sqrt 10000000)
(* (sqrt 10000000) (sqrt 10000000))
(sqrt 1000000000)
(* (sqrt 1000000000) (sqrt 1000000000))
(sqrt 100000000000000)
(* (sqrt 100000000000000) (sqrt 100000000000000))

3162.277660168379
9999999.999999998
31622.776601684047
1000000000.0000161
10000000.0
1e+014

なんだろな。。「100000000000000」はあってるな。
てか「1e+014」ってなんだろう。
みたことあるけど。
→10の14乗ってことらしい。
そういえば桁あふれのバグか何かで見たのかな。

ちなみに「1e-14」とかなら10のマイナス14乗ってことらしい。たぶん。

で、動かしてみて効果的ではなくなった理由がいまいち分からない。。えへ。

あれかな。。Newton法ってのがそもそも分かってないのが問題なのかな。
http://next1.cc.it-hiroshima.ac.jp/MULTIMEDIA/numeanal1/node8.html
・・・。見てもわかんねぇし。。

どどど、どうしよう。

せっかくだから勉強しておこうっと。

http://ja.wikipedia.org/wiki/%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%88%E3%83%B3%E6%B3%95
いやだからわかんねぇっつの!!

なんなんだっ!!ニュートンなんだからリンゴで説明すべきだろうに!!
数Ⅰですでに挫折していたオレに向かって微分だとか漸化式だとか言われてもだなっ

なんだかやらなきゃいけないことが沢山だわ。たまりに溜まっている。。

(なんとなく感じているプレッシャー)
LinuxでブログなりLispなりしたほうがええんちゃうんか
emacs使えや(Vimでも良いぞ)
gauche使えや
SICP読むなら数学得意なんだろなぁ
・数学ったって中学レベルちゃうぞ、ニュートンだぞニュートン

ううぅ。進めんのかぃな。