sicp每日一题[2.13-2.16]

Exercise 2.13

Show that under the assumption of small percentage tolerances there is a simple formula for the approximate percentage tolerance of the product of two intervals in terms of the tolerances of the factors. You may simplify the problem by assumingthat all numbers are positive.

After considerable work, Alyssa P. Hacker delivers her finished system. Several years later, after she has forgotten all about it, she gets a frenzied call from an irate user, Lem E. Tweakit. It seems that Lem has noticed that the formula for parallel resistors can be written in two algebraically equivalent ways:

He has written the following two programs, each of which computes the parallel-resistors formula differently:

复制代码
(define (par1 r1 r2)
  (div-interval (mul-interval r1 r2)
                (add-interval r1 r2)))

(define (par2 r1 r2)
  (let ((one (make-interval 1 1)))
    (div-interval
     one (add-interval (div-interval one r1)
                       (div-interval one r2)))))

Lem complains that Alyssa's program gives different answers for the two ways of computing. This is a serious complaint.


这道题一是要修改乘法函数,二是要演示两种计算并联电阻的方法计算的结果不一致。

复制代码
(define (mul-interval x y)
  (let ((cx (center x))
        (cy (center y))
        (px (/ (percent x) 100))
        (py (/ (percent y) 100)))
    (make-interval (* (- cx (* cx px)) (- cy (* cy py)))
                   (* (+ cx (* cx px)) (+ cy (* cy py))))))

(define r1 (make-interval 6.12 7.48))
(define r2 (make-interval 4.465 4.935))

(display-interval-tolerance (par1 r1 r2))
(display-interval-tolerance (par2 r1 r2))

; 执行结果
2.844199964577264 ± 22.613352145193332%
2.777440701636504 ± 7.05260392723452%

Exercise 2.14

Demonstrate that Lem is right. Investigate the behavior of the system on a variety of arithmetic expressions. Make some intervals A and B, and use them in computing the expressions A/A and A/B. You will get the most insight by using intervals whose width is a small percentage of the center value. Examine the results of the computation in center-percent form (see Exercise 2.12).


复制代码
(define r1 (make-interval 6.12 7.48))
(define r2 (make-interval 4.465 4.935))

(display-interval (div-interval r1 r1))
(display-interval (div-interval r1 r2))
(newline)
(display-interval-tolerance (div-interval r1 r1))
(display-interval-tolerance (div-interval r1 r2))

; 执行结果
[0.8181818181818182, 1.222222222222222]
[1.2401215805471126, 1.6752519596864504]

1.02020202020202 ± 19.801980198019795%
1.4576867701167815 ± 14.925373134328357%

根据执行结果来看,Lem显然是对的,对于 A/A,答案显然应该是 1 才对,但是程序计算出来的却是一个相对很大的范围,这是因为计算区间除法时,我们并没有定义"相等"这个概念,所以计算 A/A 时,它也按照通用的方法去计算了。

Exercise 2.15

Eva Lu Ator, another user, has also noticed the different intervals computed by different but algebraically equivalent expressions. She says that a formula to compute with intervals using Alyssa's system will produce tighter error bounds if it can be written in such a form that no variable that represents an uncertain number is repeated. Thus, she says, par2 is a "better" program for parallel resistances than par1. Is she right? Why?


Eva 说的是对的,对于练习 2.13 计算出的两个答案,par2 更准确,跟书上给出的答案是一致的,至于原因我觉得应该是区间之间的运算每次都会增加不确定性,par2 其实只有相加那一步是两个区间进行运算,其他的都可以看作确定数字与区间的运算,没有增加额外的不确定性;而 par1 进行了3次区间之间的运算------------乘法、加法和除法,乘法和除法都会使结果变得不确定。

Exercise 2.16

Explain, in general, why equivalent algebraic expressions may lead to different answers. Can you devise an interval-arithmetic package that does not have this shortcoming, or is this task impossible? (Warning: This problem is very difficult.)


复制代码
(define a (make-interval 2 4))
 
(define b (make-interval -2 0))
 
(define c (make-interval 3 8))
 
(define x (mul-interval a (add-interval b c)))
 
(define y (add-interval (mul-interval a b)
                        (mul-interval a c)))


(display-interval x)
(display-interval y)

; 执行结果
[2, 32]
[-2, 32]

根据上面的结果可以看到,区间运算连乘法分配律都无法保证。至于有没有无缺陷的区间运算规则,我大概想了一下,没有什么头绪,就没继续想了。。

相关推荐
core5124 天前
【硬核测评】Gemini 3 编程能力全面进化:不仅仅是 Copilot,更是你的 AI 架构师
人工智能·编程·copilot
Logic1016 天前
一份系统化《Python爬虫教程》学习笔记:Python爬虫63个核心案例精讲(含反爬策略与源码剖析)
经验分享·爬虫·python·学习笔记·编程·软件开发
Logic1018 天前
《Windows批处理(BAT)脚本实战大全:41个场景告别重复操作》含文件处理/查找/重命名/清理等)
windows·编程·文件管理·bat·效率工具·批处理·自动化脚本
独泪了无痕8 天前
COALESCE函数:处理NULL值的利器
sql·mysql·函数式编程
咨询QQ180809519 天前
Bootloader上位机,基于UDS实现,DoCAN(包括源码和发布的小程序)
lisp
MoonBit月兔13 天前
审美积累 | MoonBit LOGO 投稿作品速递
开发语言·编程·moonbit
酬勤-人间道14 天前
VTK、CGAL及Carve空间闭合曲线切割三维模型的问题分析
计算机·vtk·编程·cgal·布尔计算
Zzzzzxl_16 天前
深入理解Java JVM中的垃圾回收器
java·jvm·编程·性能调优·垃圾回收
程序员鱼皮17 天前
MySQL 从入门到删库跑路,保姆级教程!
java·计算机·程序员·编程·编程经验