继续分数和功能“老鼠”

让我告诉你关于有争议的MATLAB函数老鼠

内容

经典老鼠

这个函数老鼠是MathWorks以上。这是73年我最初的Fortran MATLAB函数。这是帮助条目从40年前。

< >帮助老鼠
老鼠实验函数试图删除的舍入误差的结果,应该是“简单的”理性的数字。老鼠(X)接近的每个元素X的连分式形式
a / b = d1 + 1 / (d2 + 1 / (d3 +……+ 1 / dk))
与k < = len整数di和abs (di) < = max。参数的默认值是len = 5和max = 100。老鼠(len max)改变默认值。增加len或最大数量的增加可能的分数。< A、B > =鼠(X)产生整数矩阵A和B,这样
A / B =鼠(X)
一些例子:
长T = hilb (6), X =发票(T) < A、B > =鼠H (X) = A / B, S =发票(H)
短e d = 1:8, e = (d), A = abs (d ' * e - e ' * d) X =发票(A)鼠(X)显示(ans)

一个例子

让我们试试用现代MATLAB和第二个例子格式的老鼠

格式d = 1:6的e =(大小(d)), A = abs (d ' * e - e ' * d)格式eX =发票(A)格式老鼠X
d = 1 2 3 4 5 6 e = 1 1 1 1 1 1 = 0 1 2 3 4 5 1 0 1 2 3 4 2 1 0 1 2 3 4 3 2 1 0 1 2 3 2 1 0 1 5 4 3 2 1 0 X = -4.0000 1.0000 -9.9920 -3.3307 8.3267 5.0000 e-01 e-01 e-17 e-17 e-17 e-01 5.0000 e-01 -1.0000 e + 00 5.0000 5.0000 8.3267 -5.5511 8.8818 3.6978 e-01 e-33 e-17 e-17 e-17 e-01 -1.0000 e + 00 5.0000 5.0000 3.6978 -3.3307 -9.2519 1.4063 e-01 e-16 e-17 e-17 e-33 e-01 -1.0000 e + 00 5.0000 5.0000 1.4063 8.8818 -9.9920 5.5511 e-01 e-17 e-17 e-17 e-16 e-01 -1.0000 e + 00 5.0000 e-01 1.0000 -4.0000 5.0000 5.5511 -9.2519 -5.5511 e-01 e-17 e-17 e-17 e-01 e-01 X = 1到5列-2/5 1/2 * * * 1/2 1 1/2 * * * 1/2 1 1/2 * * * 1/2 1 1/2 * * * 1/2 1 1/10 * * * 1/2列6 1/10 * * * 1/2 -2/5

哪个版本的X你更喜欢哪个?第一,印有一个浮点格式的舍入错误显而易见。或第二,印有一个理性的格式,试图掩盖了舍入。对于这个示例,几乎所有人都赞成理性的格式。

不要试图隐藏它

但我知道最好解释浮点运算比试图隐藏它。除此之外,最重要的是MATLAB计算涉及更大的矩阵,特征值、微分方程和信号处理。他们没有这么整齐的结果。

所以,我们没有多大用处老鼠格式的老鼠今天,但是他们还在那里,正如我所说的,他们适度争议。

有争议的算法

的核心老鼠产生持续的分数通过不断减去整数部分,剩下的倒数。如果没有回报,进程终止,因为输入是一个合理的数字。如果输入是非理性的,这个过程不会终止。

controversary来自整数部分的含义。生成适当的分数,整数部分地板上。总是让一个积极的分数回报。但是在40年前,我有聪明和使用而不是地板上。这意味着需要更少的条款获得指定的精度,但持续的分数,要我说,非正统的。让我们看到更多的例子。

π

让我们产生越来越准确合理的近似\π美元。有两个输出参数,老鼠展开连分数产生两个整数的比率相同的值。的准确性老鼠是由一个可选的宽容,老鼠(x, tol)。默认的公差是1.0 e-6 *规范(x)

要求低精度产生\π美元的一个熟悉的近似值。

形式=“托尔= % 6.1 e \ n r = % s \ n = % d / % d \ n ';托尔= 1.0依照;r =鼠(π,tol);[n、d] =鼠(π,tol);流(形式,托尔,r n d)
托尔= 1.0 e-02 r = 3 + 1 / (7) = 22/7

默认的公差产生一个不太熟悉的,但优雅的近似。

托尔= 1.0 e-6;r =鼠(π,tol);[n、d] =鼠(π,tol);流(形式,托尔,r n d)
托尔= 1.0 e-06 r = 3 + 1 / (7 + 1 / (16)) = 355/113

高准确性产生负面的词。

托尔= 1.0 e-8;r =鼠(π,tol);[n、d] =鼠(π,tol);流(形式,托尔,r n d)
托尔= 1.0 e-08 r = 3 + 1 / (7 + 1 / (16 + 1 / (-294))) = 104348/33215

另一个负面的词。

托尔= 1.0 e-11;r =鼠(π,tol);[n、d] =鼠(π,tol);流(形式,托尔,r n d)
托尔= 1.0 e-11 r = 3 + 1 / (7 + 1 / (16 + 1 / (-294 + 1 / (3 + 1 / (4))))) = 1146408/364913

乳胶

如果我们小心花括号,乳胶和MathJax排版,最后连分数,对这篇文章产生一个图形。

{{1}\ / {{7 + {{1}\ / {{16 + {{1}\ / {{-294 + {{1}\ / {{3 + {{1}\ / {4}}}}}}}}}}}}}}

$ $ {{1}\ / {{7 + {{1}\ / {{16 + {{1}\ / {{-294 + {{1}\ / {{3 + {{1}\ / {4}}}}}}}}}}}}}}$ $

ratp

我有另一个函数,ratp,这是老鼠取而代之的是地板上它产生适当的,但更长,继续分数与积极的方面。让我们看看它如何比较老鼠。由于MATLAB数量π近似于\π是理性的美元,我们可以设置托尔为零,而不必担心一个无限循环。

形式=“托尔= % 6.1 e r \ n = % s \ n p = % s \ n \ n ';托尔= 10。^[2 6 8负-11)流(形式,托尔,老鼠(π,tol) ratp(π,tol))结束
托尔= 1.0 e-02 r = 3 + 1 / (7) p = 3 + 1 / (7) tol = 1.0 e-06 r = 3 + 1 / (7 + 1 / (16)) p = 3 + 1 / (7 + 1 / (15 + 1 / (1))) tol = 1.0 e-08 r = 3 + 1 / (7 + 1 / (16 + 1 / (-294))) p = 3 + 1 / (7 + 1 / (15 + 1 / (1 + 1 / (292)))) tol = 1.0 e-11 r = 3 + 1 / (7 + 1 / (16 + 1 / (-294 + 1 / (3 + 1 / (4))))) p = 3 + 1 / (7 + 1 / (15 + 1 / (1 + 1) / (292 + 1 / (1 + 1 / (1 + 1 / (1 + 1 / (2)))))))) tol = 0.0 e + 00 r = 3 + 1 / (7 + 1 / (16 + 1 / (-294 + 1 / (3 + 1 / (4 + 1 / (5 + 1 / (-15))))))) p = 3 + 1 / (7 + 1 / (15 + 1 / (1 + 1) / (292 + 1 / (1 + 1 / (1 + 1 / (1 + 1 / (2 + 1 / (1 + 1 / (3 + 1 / (1 + 1 / (14))))))))))))

φ

世界上最无理数,以连分式近似的长度来衡量,是\φ美元,黄金比例。(证据:解决x = 1 + 1 / x美元)。系数在合适的连分数的,从而实现尽可能慢的收敛。同样的精度,ratp(φ,tol)需要大约两倍的条款老鼠(φ,tol)

格式φ=(1 +√5)/ 2托尔= 1.0 r =鼠的军医(φ)p = ratp(φ)
φ= 1.6180 tol = 1.0000 e-04 r = ' 2 + 1 /(3 + 1 /(3 + 1 /(3 + 1 /(3 + 1 /(3 + 1 /(3 + 1 /(3)))))))的p = ' 1 + 1 / (1 + 1 / (1 + 1 / (1 + 1 / (1 + 1 / (1 + 1 / (1 + 1 / (1 + 1 / (1 + 1 / (1 + 1 / (1 + 1 / (1 + 1 / (1 + 1 / (1 + 1 / (1))))))))))))))”
托尔= 0;lengthr =长度(鼠(φ,tol)) lengthp =长度(ratp(φ,tol))
lengthr = 154 lengthp = 297

DIY

(我的国际读者,DIY代表“做自己”。)创建自己的ratp通过编辑一个单词的一个副本matlab工具箱\ \ specfun \ rat.m。比较两个函数√6 (2)。警告:所有不是似乎乍一看。




发表与MATLAB®R2018b

|

评论

留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。