`
SavageGarden
  • 浏览: 223141 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SICP学习笔记 2.1.4 扩展练习:区间算术

    博客分类:
  • SICP
 
阅读更多

    练习2.7

;; 抽象对象"区间"有两个端点, 一个下界一个上界, 则直接有如下过程
(define (lower-bound x) (car x))
(define (upper-bound x) (cdr x))

 

    练习2.8

(define (sub-interval x y)
  (make-interval (- (lower-bound x) (upper-bound y))
		        (- (upper-bound x) (lower-bound y))))
 

 

    练习2.9

;; 给定区间x=(a1, b1)、y=(a2, b2)
;; Wx=(a1+b1)/2、 Wy=(a2+b2)/2
;; 两个区间之和z=(a1+a2, b1+b2)
;; Wz=[(a1+a2) + (b1+b2)]/2
;;   =[a1+b1 + a2+b2]/2
;;   =Wx + Wy
;; 即两个区间之和的宽度为两个区间宽度之和
;; 同理得两个区间之差的宽度为两个区间宽度之差
;; 对于乘除
;; z=(a1*a2, b1*b2)
;; Wz=(a1*a2 + b1*b2)/2
;; 与Wy=(a2+b2)/2没有必然联系

 

    练习2.10

;; 当出现跨越0的区间时,对其做除法,取其倒数,在0附近将分别得到负无穷和正无穷,因此需要规避此种情况
;; 在除法中添加对区间是否跨越0的判断
(define (div-interval x y)
  (if (and (< (lower-bound y) 0) (> (upper-bound y) 0))
      (display "error interval")
      (mul-interval x
		          (make-interval (/ 1.0 (upper-bound y))
				                 (/ 1.0 (lower-bound y))))))
 

    练习2.11

;; 用+、-来表示一个区间上下界的正负情况,则对于两个区间来说有
;; ((+,+), (+,+))、((-,-), (-,-))
;; ((+,+), (-,-))、((-,-), (+,+))
;; ((+,+), (-,+))、((-,+), (+,+))
;; ((-,-), (-,+))、((-,+), (-,-))
;; ((-,+), (-,+))
;; 9种情况
;; 针对每种情况,因为已经确定了正负因此可以直接用两次乘法分别得到乘积区间的上下界
(define (new-mul-interval x y)
  (let ((Lx (lower-bound x))
				(Ux (upper-bound x))
				(Ly (lower-bound y))
				(Uy (upper-bound y)))
			    (cond ((and (< Ux 0) (< Uy 0))
				   (make-interval (* Ux Uy) (* Lx Ly)))
				  ((and (> Lx 0) (> Ly 0))
				   (make-interval (* Lx Ly) (* Ux Uy)))
				  ((and (> Lx 0) (< Uy 0))
				   (make-interval (* Ux Ly) (* Lx Uy)))
				  ((and (< Ux 0) (> Ly 0))
				   (make-interval (* Lx Uy) (* Ux Ly)))
				  ((and (> Lx 0) (< Ly 0) (> Uy 0))
				   (make-interval (* Ux Ly) (* Ux Uy)))
				  ((and (> Ly 0) (< Lx 0) (> Ux 0))
				   (make-interval (* Uy Lx) (* Uy Ux)))
				  ((and (< Ux 0) (< Ly 0) (> Uy 0))
				   (make-interval (* Lx Uy) (* Ux Ly)))
				  ((and (< Uy 0) (< Lx 0) (> ux 0))
				   (make-interval (* Ly Ux) (* Uy Lx)))
				  ((and (< Lx 0) (> Ux 0) (< Ly 0) (> Uy 0))
				   (make-interval (min (* Lx Uy) (* Ly Ux))
						              (max (* Lx Ly) (* Ux Uy))))))) 

(define (test-mul a1 b1 a2 b2)
  (let ((x (make-interval a1 b1))
				(y (make-interval a2 b2)))
    (new-mul-interval x y)))
    

1 ]=> (test-mul 1 2 2 3)
;Value 13: (2 . 6)

1 ]=> (test-mul 1 2 -3 -2)
;Value 16: (-6 . -2)

1 ]=> (test-mul 1 2 -3 2)
;Value 17: (-6 . 4)

1 ]=> (test-mul -2 1 -3 2)
;Value 18: (-4 . 6)

 

    练习2.12

(define (persent c p)
  (* p (/ c 100.0)))
(define (make-center-percent c p)
  (let ((P (persent c p)))
    (make-interval (- c P) (+ c P))))
 

    练习2.13

;; 设区间X的误差为Px, 区间Y的误差为Py, 则有
;; (X±Px)、(Y±Py)
;; 设±Px=Dx、±Py=Dy, 则有
;; (X+Dx)*(Y+Dy)
;; =X*Y + X*Dy + Y*Dx + Dx*Dy
;; 在误差为很小的百分数时, Dx*Dy=0, 则有
;; (X+Dx)*(Y+Dy) = X*Y + X*Dy + Y*Dx
;; 即区间X、Y乘积的误差为X*Dy + Y*Dx
;; 则其百分数误差值为
;; [(X*Dy + Y*Dx)/(X*Y)]*100%
;; = (Dx/X + Dy/Y)*100%
;; 即(±Px/X + ±Py/Y)*100%

 

    练习2.14

1 ]=> (div-interval (make-interval 4 5) (make-interval 4 5))
;Value : (.8 . 1.25)

1 ]=> (div-interval (make-interval 400 401) (make-interval 400 401))
;Value : (.997506234413965 . 1.0025)

1 ]=> (div-interval (make-interval 4 5) (make-interval 5 8))
;Value : (.5 . 1.)

1 ]=> (div-interval (make-interval 400 401) (make-interval 800 801))
;Value : (.4993757802746567 . .50125)

1 ]=> (par1 (make-center-percent 2 10) (make-center-percent 3 10))
;Value : (.8836363636363637 . 1.6133333333333333)

1 ]=> (par2 (make-center-percent 2 10) (make-center-percent 3 10))
;Value : (1.08 . 1.32)

;; par1和par2在数学表达式上来讲是对等的, 但是因为在对具体数字的计算过程中会有四舍五入和精度限制,因此会造成这样的两个不同的结果

 

    练习2.15

;; 对于电阻串联公式	1 / (1/R1 + 1/R2)
;; 转换成par1的格式
	1 / (1/R1 + 1/R2)
= 1 / (1/R1*(R2/R2) + 1/R2*(R1/R1))
= 1 / (R2/R1*R2 + R1/R1*R2)
= R1*R2/(R1+R2)
;; 即在此转换过程中假设了(R1/R1=1, R2/R2=1),但是在2.14中的测试
1 ]=> (div-interval (make-interval 4 5) (make-interval 4 5))
;Value : (.8 . 1.25)

1 ]=> (div-interval (make-interval 400 401) (make-interval 400 401))
;Value : (.997506234413965 . 1.0025)

;; 可知对于一个区间A, A/A的值并不为1, 因此使用par1进行计算将会扩大误差

 

    练习2.16

;; 个人感觉应该不能, 因为等价的代数式必然经过一系列的变换,
;; 而在变换的过程中必然会对不准确的变量重复计算, 因此会放大误差, 越是复杂的变换可能得到的结果误差越大.
;; 但是如果能在事先对变换中的一些特殊计算进行特殊定义, 有可能会得到误差比较小的结果
;; 比如按照上面区间除法的过程, 对区间A/A的值并不为1, 如果对其特殊对待, 视其为(1, 1), 可能会好一些.
 

 

 

 

1
5
分享到:
评论

相关推荐

    SICP(计算机体系结构)

    - **2.1.4 扩展练习:区间算术**: 通过一个具体的案例来巩固所学知识。 - **2.2 层次数据与闭包属性** - **2.2.1 序列的表示**: 讨论序列数据结构的设计与实现。 - **2.2.2 层次结构**: 探讨层次数据结构的特点...

    Structure Interpration of Computer Programs(英文版)

    - **2.1.4 扩展练习:区间算术**:通过区间算术这一具体案例,进一步加深对数据抽象的理解。 - **2.2 层次数据与封闭性质** - **2.2.1 序列的表示**:讨论如何表示序列,以及这些表示方法的优缺点。 - **2.2.2 ...

    sicp:我的 SICP 练习

    《SICP:我的SICP练习》是关于Scheme编程语言和计算机程序设计原理的一份学习资料。SICP,全称《结构与解释程序》(Structure and Interpretation of Computer Programs),是由Harvard大学的Hal Abelson和MIT的...

    sicp-study-group

    CoRecursive Slack SICP研究小组 章节 1-1-1 ::表达式 1-1-2 ::命名与环境 1-1-3 ::评估组合 1-1-4 ::复合程序 1-1-5 ::程序应用的替代模型 1-1-6 ::条件表达式和谓词 ... 2-1-4 ::扩展练习:区间算术 2-2-1

    sicp第二章练习题的解答

    在SICP中,练习2.5通常涉及到了过程定义、抽象和组合,可能需要读者理解并实现一种计算机制,如迭代或递归。 2. **chapter2.ss**: 这可能是整个第二章所有练习题的集合或者部分题目的解答。通过这个文件,读者可以...

    sicp_notes:SICP笔记和练习

    《SICP笔记和练习》是一份详尽的资源,主要涵盖了由MIT教授们编写的经典计算机科学教材《Structure and Interpretation of Computer Programs》(简称SICP)的学习笔记和练习解答。这份资料以HTML格式呈现,便于在线...

    sicp 2016 from

    - **扩展练习:区间算术 (Extended Exercise: Interval Arithmetic)**:提供了一个具体的应用场景来进一步巩固所学概念。 - **层次数据与闭包性质 (Hierarchical Data and the Closure Property)** - **序列表示 ...

    sicp-py-zh:[译] UCB CS61a SICP Python 描述 中文版

    UCB CS61a SICP Python 描述 原文: 译者: 协议: 前面是山,我们就爬山;前面是海,我们就渡海;前面是皇宫,我们就开炮!——《龙族前传》 ‍ 下载 Docker docker pull apachecn0/sicp-py-zh docker run -tid -p ...

    sicp in python 中文版 sicp

    sicp in python 中文版 sicp in python 中文版 sicp in python 中文版 download : https://github.com/wizardforcel/sicp-py-zh

    sicp-solutions:SICP练习解决方案

    "sicp-solutions"是一个针对该书练习题的解答集,主要使用了Scheme语言,一个Lisp方言,而具体的实现环境是mit-scheme 9.2。 Scheme语言是Lisp家族的一员,以其简洁的语法和强大的函数式编程特性闻名。在"sicp-...

    sicp-js-zh:【译】NUS CS1101s SICP JavaScript 描述

    NUS CS1101s SICP JavaScript 描述原文:协议:如果你交给某人一个程序,你将折磨他一整天;如果你教某人如何编写程序,你将折磨他一辈子。——David Leinweber贡献指南本项目需要校对,欢迎大家提交 Pull Request。...

    sicp_but_clojure:Clojure中的SICP示例和练习

    这些源代码文件扩展了./resources中的笔记内容,提供了解决SICP练习的实际实现。学习者可以通过阅读和修改这些代码,加深对Clojure语法和SICP概念的理解。 在Clojure中实现SICP的益处在于: - **函数式编程的思维...

    sicp:我对 SICP 练习的解决方案(及其尝试)

    SICP - 笔记和练习我把它放在这里是因为有一天它可能会帮助某人。 练习是ex*文件。 章节中的注释和代码是ch文件。安装下载 Racket.app。 使用 DrRacket.app 或像这样启动 Racket repl: /Applications/Racket\ v...

    sicp:我对SICP练习的回答

    在SICP的练习中,我们会学习如何高效地操作这些数据结构,以及如何根据需求自定义数据结构,如树、图和队列等。 3. **递归**:递归是Scheme的核心特性之一。通过递归,我们可以解决许多复杂问题,如遍历、搜索和...

    SICP 习题答案

    《计算机程序的构造和解释》(SICP)是一本极具影响力的计算机科学教材,由Harold Abelson和Gerald Jay Sussman所著,MIT出版社出版。这本书以其深入探讨编程概念、程序设计方法以及计算机系统的工作原理而闻名。1-3...

    sicp-memo-ans:SICP笔记和答案

    请参考那些正在学习SICP的人。 笔记 如果你想在 gauch 中使用随机函数 (use math.mt-random) (define m (make &lt;mersenne&gt; :seed (sys-time))) (mt-random-integer m 1000) (define (random n) (mt-random-integer ...

    sicp-compiler-notes:有关SICP编译器的一些说明和演示

    在SICP上进行试用-&gt; WASM编译演示:SICP如何将机器代码注册为WASM 为阶乘翻译LISP代码(define (factorial n) (define (iter product counter) (if (&gt; counter n) product (iter (* counter product) (+ counter 1)))...

Global site tag (gtag.js) - Google Analytics