首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >导数方案

导数方案
EN

Stack Overflow用户
提问于 2019-10-15 04:53:39
回答 1查看 111关注 0票数 1

D函数应以其简化形式返回输入表达式的导数。我知道有一个派生方案函数,但我用列表来挑战自己。我是这门语言的新手。我已经编写了测试用例来测试我的解决方案,但预期的输出是错误的,并且没有得到简化。

代码语言:javascript
复制
(define d
  (λ (e)
    (cond ((number? e) 0)
      ((equal? e 'x) 1)
      (else
       (let ((op (car e)) (args (cdr e)))
         (apply (lookup op d-op-table) args))))))


(define d-op-table
  (list(list '+   (λ (u v)(list '+ (d u) (d v))))
       (list '-   (λ (u v)(list '- (d u) (d v))))
       (list '*   (λ (u v)(list '+ (list '* u (d v))(list '* v (d u)))))))
       (list 'sin (λ (u)(list '*( list 'cos (d u)))))
       (list 'cos (λ (u)(list '*( list '-sin (d u)))))
       (list 'log (λ (u)(list '* (list '/1 u) (d u))))
       (list 'exp (λ (u)(list '* (d u)(list 'exp u))))
       (list 'expt (λ (u v) (list 'expt (list '* v  u) (- v 1))))

(define lookup
  (λ (op
      table)
    (if (equal? op (caar table))
    (cadar table)
    (lookup op (cdr table)))))



;; Test cases

;; (d '(* (+ x 4) (+ x -7)))
;; '(+ (* (+ x 4) (+ 1 0)) (* (+ x -7) (+ 1 0)))

;; (d '(* x (* x (* x (* x x)))))
;; '(+ (* x (+ (* x (+ (* x (+ (* x 1) (* x 1))) (* (* x x) 1))) (* (* x (* x x)) 1))) (* (* x (* x (* x x))) 1))

示例:

通过输入函数

代码语言:javascript
复制
(d '(* (+ x 1) (+ x -1))) 

我希望

代码语言:javascript
复制
(+ (* (+ x 1) (+ 1 0)) (* (+ 1 0) (+ x -1)))

但我得到了

代码语言:javascript
复制
(+ (* (+ x 1) (+ 1 0)) (* (+ x -1) (+ 1 0)))
EN

回答 1

Stack Overflow用户

发布于 2019-10-16 16:21:00

这是因为乘法的情况在这里是这样说的:

代码语言:javascript
复制
(list '+ (list '* u (d v)) (list '* v (d u)))

这就是d(u*v) = u * dv + v * du

第二个术语是“翻转的”,而不是你说的想要的东西,也就是d(u*v) = u * dv + du * v

代码语言:javascript
复制
(list '+ (list '* u (d v)) (list '* (d u) v))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58383929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档