书上介绍了符号求导的思路:
- 观察符号求导的数学规则, 提炼出关键的几个工具函数
- 设计了一种基于 scheme 符号来表达算式
- 综合 1 和 2 设计出 drive 这样的过程来做求导 (针对加法和乘法组合的多项式)
- 进一步介绍了
(0*x + 1*y)
类似这样的情况要怎么做优化, 然而化简是没有固定规则的, 在文章中的情况可能是最简的, 但是在其他地方可能就不是最简的了, 有些场景 0 还是得留下的, 如在一些二维向量空间的应用中确实有 0x 的情况。 - 习题...
这题主要是让前文的 drive 支持对幂的求导,按照文章前面的思路,对幂的求导应该需要:
- exponentiation?
- base
- exponent
- make-exponentiation
最后利用这四个基本函数来在 drive 中加一个分支以实现对幂的求导
详情见 ./drive-exp.rkt
修改表示法就好了
; 取出被加數
(define (augend s)
(define cdddrs (cdddr s))
(if (eq? cdddrs (list))
(caddr s)
(cons '+ (cddr s))))
; 取被乘数
(define (multiplicand s)
(define cdddrs (cdddr s))
(if (eq? cdddrs (list))
(caddr s)
(cons '* (cddr s))) )
详情见 ./drive-more-args.rkt
需要解析中缀的情况, 第一小题这里是假设 + 和 * 总是取两个参数并且补全了括号的情况
这种情况比较简单, 直接基于 ./drive.rkt
并修改其中的几个基础定义即可, deriv 根本不用改
详见 ./drive-middle-1.rkt
这里要在 ./drive-middle-1.rkt
基础上, 考虑 + 和 * 的优先级 & 个数了
见 ./drive-middle-2.rkt