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)
对平滑函数进行n次重复,可以借助1.43里的repeated函数,将repeated中的参数改为((smooth f) n)即可。
posted @ 2025-12-04 22:52  檐上落白luckin  阅读(12)  评论(0)    收藏  举报