这次回顾第二章第一部分习题。
学习资料:
https://github.com/DeathKing/Learning-SICP
https://mitpress.mit.edu/sites/default/files/sicp/index.html
https://www.bilibili.com/video/BV1Xx41117tr?from=search&seid=14983483066585274454
参考资料:
https://sicp.readthedocs.io/en/latest
https://stackoverflow.com/questions/14130878/sicp-2-16-interval-arithmetic-scheme
http://wiki.drewhess.com/wiki/SICP_exercise_2.16
https://en.wikipedia.org/wiki/Interval_arithmetic#Dependency_problem
https://zhuanlan.zhihu.com/p/45914836
https://www.xuebuyuan.com/1470405.html
https://zhuanlan.zhihu.com/p/102913021
2.1(p58)
考虑了边界情形,代码如下:
1 | (load "helper.scm") |
代码如下:
1 | 2/3 |
2.2(p60)
1 | ;; point |
结果如下:
1 | (2,2) |
2.3(p60)
通过两种方式定义矩形:
- 矩形左上角和右下角。
- 矩阵左上角和长宽。
代码如下:
1 | (load "2.2.scm") |
结果如下:
1 | C: 12 |
2.4(p62)
代码如下:
1 | (define (cons x y) |
结果如下:
1 | car: 1 |
解释:
1 | (car (cons x y)) |
2.5(p62)
题目的意思是用$(a, b)$表示$2^a 3^b$形式的数,然后据此计算出car,cdr,代码如下:
1 | (load "helper.scm") |
结果如下:
1 | car: 3 |
2.6(p62)
注意到:
1 | one = (add-l zero) |
代入可得:
1 | (add-l zero) |
代码如下:
1 | (define zero (lambda (f) (lambda (x) x))) |
2.7(p63)
1 | (load "helper.scm") |
结果如下:
1 | lower-bound: 2 |
辅助函数:
1 | ;; print interval |
2.8(p63)
1 | (load "2.7.scm") |
结果如下:
1 | lower-bound: 1 |
2.9(p63)
对于区间:
定义宽度函数:
任取区间:
那么
2.10(p63)
1 | (load "helper.scm") |
结果如下:
1 | lower-bound: 2 |
2.11(p63)
这题顺着2.10的思路剔除包含$0$的情形,所以这里只分了$5$种情形,根据边界的正负讨论即可,注意如果区间包含$0$,则应该报错;题干中的$9$种情形包含了区间端点一正一负的情形:
1 | (load "2.10.scm") |
结果如下:
1 | lower-bound: 6 |
2.12(p64)
1 | (load "2.10.scm") |
结果如下:
1 | center: 1.0 |
2.13(p64)
结论正确,下面严格分析这个结论,假设我们用百分比表示法表示区间,设
考虑两个区间(假设$p\ll 1$)
那么
所以乘法积的误差约等于
2.14(p64)
编写测试程序:
1 | (load "2.12.scm") |
得到如下结果:
1 | par1 |
2.15(p65)
结论正确,下面严格分析这个结论,假设我们用百分比表示法表示区间,设
考虑两个区间
所以
注意到
所以par1的区间范围总比par2的区间范围大。
原答案(从误差分析角度考虑,供参考):
这里只考虑$p\ll 1$的情形。
考虑
所以
上述约等于号均表示忽略了高阶项。
记
那么
所以方法1的误差总体来说较大。
2.16(p65)
参考资料:
https://stackoverflow.com/questions/14130878/sicp-2-16-interval-arithmetic-scheme
http://wiki.drewhess.com/wiki/SICP_exercise_2.16
https://en.wikipedia.org/wiki/Interval_arithmetic#Dependency_problem
https://zhuanlan.zhihu.com/p/45914836
https://www.xuebuyuan.com/1470405.html
域的定义:
https://zhuanlan.zhihu.com/p/102913021
原因解释:
该区间运算系统不满足域的定义(只考虑正数区间的情形),首先$1$元必然为$[1,1]$,对于$[a,b], a<b$,其逆元必然为$[1/b, 1/a]$,注意该区间不满足区间的定义(右端点大于等于左端点),由此可以推出不是每个元素都存在逆元,从而该运算系统不是域。
如果该系统是域,记区间分别为$i_1, i_2$,那么
此时两种电阻计算结果相同。
从这个角度来说,个人感觉无法设计出满足域性质的区间运算系统,但是有近似计算的方法。
记区间集合为$I$,一般的区间运算可以定义为:
注意该运算实际上多元函数的推广:
具体计算方法如下:
按照定义,可以利用两种方法进行区间运算:
- 求$f(x_1,\ldots,x_n)$的极值点。
- 利用蒙特卡洛模拟的方法计算。
值的回顾的习题
2.6,2.15,2.16