scheme - 计算高阶函数的黎曼积分公式
问题描述
SICP在1.3.1章介绍了黎曼积分公式
(define (integral f a b dx)
(define (add-dx x) (+ x dx))
(* (sum f (+ a (/ dx 2.0)) add-dx b)
dx))
将其应用于特定案例
#+name: case-1.3.1-integral.scm
#+BEGIN_SRC scheme :session sicp
(define pi 3.141592653589793)
(define (integral2 f a b dx)
(define (add-dx x) (+ x dx))
(* (sum (f b)
(+ a (/ dx 2.0))
(lambda (x) (+ x dx))
b)
dx))
(define (f b)
(lambda (x) (/ 1 (sqrt
(- (sin x)
(sin b))))))
(* (integral2 f 0 (/ pi 6) 0.00001)
(sqrt (/ 40
(* 3 9.8))))
#+END_SRC
#+RESULTS: case-1.3.1-integral.scm
: 0.0-1.777598336021436i
得到完美答案 1.777598336021436
然后翻译成elisp
从小做起:
#+name: case-1.3.1-integral.el
#+begin_src emacs-lisp :session sicp :lexical t
(defun integral (f a b dx)
(* (sum f
(+ a (/ dx 2.0))
(lambda (x) (+ x dx))
b)
dx))
(defun sum(term a next b)
(if (> a b)
0
(+ (funcall term a)
(sum term (funcall next a) next b))))
(integral #'cube 0 1 0.01)
#+end_src
#+RESULTS: case-1.3.1-integral.el
: 0.24998750000000042
它有效,因此用它来解决前面的问题
#+begin_src emacs-lisp :session sicp :lexical t
(defvar pi 3.141592653589793)
(defun integral (f a b dx)
(* (sum f
(+ a (/ dx 2.0))
(lambda (x) (+ x dx))
b)
dx))
(defun f (b)
(lambda (x) (/ 1 (sqrt
(- (sin x)
(sin b))))))
(defun integral2 (f a b dx)
(* (sum (funcall f b)
(+ a (/ dx 2.0))
(lambda (x) (+ x dx))
b)
dx))
(integral2 #'f 0 (/ pi 6) 0.01)
#+end_src
但它返回一个毫无意义的结果
ELISP> (integral2 #'f 0 (/ pi 6) 0.01)
-0.0e+NaN
有什么问题?
解决方案
你使用Scheme得到的答案是一个复数,调用的结果sqrt
(你确定Scheme代码一开始是正确的吗?你应该仔细检查一下):
0.0-1.777598336021436i
不幸的是,Elisp不支持复数,这就是我们NaN
在其中加入 a 的原因。但这不是真正的问题。您应该调查为什么在 Scheme 代码中得到复杂的结果,积分不应该返回复杂的值!
推荐阅读
- c++ - 当我输入任何内容时,我的代码输出无效
- python - 如何在不使用 ipython 的情况下配置 jupyter notebook 以获得具有某些导入的预加载单元?
- reactjs - React-Bootstrap's NavDropdown: disable toggle onClick?
- arduino - arduino 可以将鼠标移动到屏幕上的确切位置吗?
- liquid - 可以治疗吗?作为文本而不是过滤器?
- python - 如果列及其值存在于两个数据框中,如何合并两个数据框?
- ruby-on-rails - 如果 Spree Deface Original 已更改,是否会引发错误和/或单元测试?
- performance - 为什么在 L1 缓存中使用带有存储指令块预取的 MFENCE?
- php - PHP/Laravel:在 PHP 中创建 JSON 时如何插入新的 json 字段?
- oracle - 如何在较低环境中测试数据库脚本的所有环境配置