scheme 导数的概念
根据牛顿法,如果g(x)是一个可微函数,那么方程g(x)=0的一个解就是f(x)的一个不动点,其中f(x)=x-g(x)/Dg(x),其中Dg(x)就是g对x的导数。
通过牛顿法,我们可以将方程求解的过程转换为寻找不动点的过程。
但还有一个问题要解决,如何表达导数?
根据导数的定义,Dg(x)=(g(x+dx)-g(x))/dx
在过程中可定义为:
(define (deriv g)
(lambda (x)
(/ (- (g (+ x dx)) (g x)) dx )))
(define dx 0.00001)
解决了导数后,函数的求解过程就可以表述为一个求不动点的过程了。
点击查看代码
;寻找不动点
(define tolenrance 0.0001)
(define (fixed-point f first-guess)
(define (close-enough? v1 v2) ( < (abs (- v1 v2)) tolenrance))
(define (try guess)
(let ((next (f guess)))
(if (close-enough? guess next)
next
(try next)
)
))
(try first-guess)
)
;牛顿法的实现
(define (newton-transform g)
(lambda (x)
(- x (/ (g x) ((deriv g) x)))
)
)
(define (newton-method g guess)
(fixed-point (newton-transform g) guess)
)
练习1.40 要求定义过程cubic,应用在牛顿法中,能够逼近三次方程x³+ax²+bx+c的零点
根据要求,只需要定义一个方程即可
点击查看代码
;1.40
(define (cubic a b c)
(lambda (x)
(+ (cube x) (* a (square x)) (* b x) c)))
练习1.41 定义过程double,可以对函数进行复合,复数次执行。
点击查看代码
(define (double g)
(lambda (x)
(g (g x))
))
(define (inc x)
(+ x 1))
(((double (double double)) inc) 5)
21
练习1.42 构造一个复合函数,令f和g两个单参数的函数复合定义为函数 f(g(x))
点击查看代码
(define (compose f g)
(lambda (x) (f (g x))))
((compose square inc) 6)
49
练习1.43 构造一个函数,可以构造f的n茨重复应用(1.42的进阶)
点击查看代码
(define (compose f g)
(lambda (x) (f (g x)))
)
(define (repeated f n)
(define (rep m)
(if (= m 1)
(lambda (x) (f x))
(compose f (rep (- m 1))))
)
(rep n)
)
练习1.44 平滑函数。即构造一个函数对函数fx、f(x-dx)、f(x+dx)求均值
点击查看代码
(define (smooth f)
(lambda (x) ( / (+ (f (- x dx)) (f x) (f (+ x dx))) 3 )))
(define dx 0.0001)

浙公网安备 33010602011771号