問題1.40
newtons-methodの手続きと一緒に
(newtons-method (cubic a b c) 1)
の形の式で使い、三次式 x3 + ax2 + bx + c の零点を近似する手続き cubic を定義せよ。
本文に、
変換 x → g(x) が微分可能な関数であれば、方程式 g(x) = 0の解は
である。
とあるとおり、これを実装したものが newton-transform 手続きです。
(define (newton-transform g) (lambda (x) (- x (/ (g x) ((deriv g) x)))))
本文そのままですが、Dg(x) は微分するための手続きで、
と定義できますから、dx を 0.00001 とすれば
(define dx 0.00001) (define (deriv g) (lambda (x) (/ (- (g (+ x dx)) (g x)) dx)))
と実装できます。
以上を踏まえれば cubic は以下のように実装できます。
(define (cubic a b c) (lambda (x) (+ (* x x x) (* a x x) (* b x) c)))
実行してみます。
gosh> (newtons-method (cubic 1 1 1) 1) -0.9999999999997796
この式の解が 0 になる点が不動点ですから、
因数分解すると
です。この式を解くと、
となります。(2つめは虚数解になるので「解なし」です。)
よって解は、
のみです。合ってますね。
ついでに、
(define (func a b c) (lambda (x) (+ (* a x x) (* b x) c)))
のような func 手続きを定義して、
を計算してみます。この式は黄金比の方程式です。
gosh> (newtons-method (func 1 -1 -1) 1) 1.618033988752065
このように黄金比を求めることができます。