连分式与函数“rat”

让我告诉你们MATLAB中有争议的函数老鼠

内容

经典老鼠

这个函数老鼠比MathWorks还要老。它是我最初的Fortran MATLAB中的73个函数之一。这是40年前的帮助条目。

< >帮助老鼠
一个实验函数,它试图从应该是“简单”有理数的结果中去除舍入误差。RAT(X)用该形式的连分数近似X的每个元素
A /b = d1 + 1/(d2 + 1/(d3 +…)+ 1 / dk))
k <= len,整数di, abs(di) <= Max。参数的默认值为len = 5和max = 100。RAT(len,max)改变默认值。增加len或max都会增加可能的分数的数量。 = RAT(X)生成整数矩阵A和B,使
A ./ b = rat (x)
一些例子:
长T = hilb (6), X =发票(T) < A、B > =鼠H (X) = A / B, S =发票(H)
短e d = 1:8, e = ones(d), A = abs(d'*e - e'*d) X = inv(A)鼠(X)显示(ans)

一个例子

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

格式d = 1:6 e = ones(size(d)), A = abs(d'*e - e'*d)格式eX = inv(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 5.5511 -9.2519 -5.5511 1.0000 e-01 e-01 e-17 e-17 e-175.0000 -01 -4.0000 -01 X =第1列到第5列-2/5 1/2 * * * 1/2 -1 /2 * * 1/2 -1 /2 * * * 1/2 -1 /2 * * 1/2 -1 /10 * * * 1/2 6列1/10 * * * 1/2 -2/5

哪个版本的X你喜欢哪一种?第一个是用浮点格式打印的,因此舍入错误很明显。或者第二种,用一种试图掩盖四舍五入的合理格式打印出来。对于这个例子,几乎所有人都会投票给理性格式。

不要试图隐藏它

但我已经认识到,解释浮点算术比试图隐藏它要好得多。此外,大多数重要的MATLAB计算涉及更大的矩阵,特征值,微分方程和信号处理。他们并没有得到这么好的结果。

所以,我们没什么用老鼠而且格式的老鼠今天,但它们仍然存在,正如我所说,它们有一定的争议。

备受争议的算法

的核心老鼠通过重复减去整数部分并取剩余部分的倒数来生成连续分数。如果没有任何东西可以往复式,则该过程终止,因为输入是有理数。如果输入不合理,流程不会终止。

争论周年来自于整数部分的含义。为了生成合适的连分数,整数部分应该是地板上.这总是会留下一个正数。但40年前,我变聪明了,被利用了而不是地板上.这意味着可以用更少的项来获得特定的精度,但是连分数是,我应该说,非正统的.让我们看更多的例子。

π

让我们生成$\pi$的越来越精确的有理近似。有两个输出参数,老鼠展开连分式以产生两个比值相同的整数。准确性老鼠由一个可选的公差决定,老鼠(x, tol).默认容差为1.0 e-6 *规范(x)

要求低精度会产生熟悉的$\pi$近似值。

形式=' tol = %6.1e \n r = %s \n = %d/%d\n';Tol = 1.0e-2;R =鼠(pi,tol);[n,d] =鼠(pi,tol);流(形式,托尔,r n d)
Tol = 1.0e-02 r = 3 + 1/(7) = 22/7

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

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

稍高的准确度会产生一个负项。

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

又是一个消极的术语。

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

乳胶

如果我们小心使用花括号,Latex和MathJax可以对最后一个连分式进行排版,并为本文生成图形。

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

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

ratp

我有另一个函数,ratp也就是说老鼠取而代之的是地板上从而得到合适的,但更长的,带正项的连分式。我们来对比一下老鼠.由于MATLAB量π近似$\ $是有理数,我们可以设托尔到零,不用担心无限循环。

形式=' tol = %6.1e \n r = %s \n p = %s \n\n'Tol = 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))))))))))))

φ

世界上最无理数,以连分式近似值的长度来衡量,是$\phi$,黄金比例。(证明:解$x = 1 + 1/x$。)适当连分式中的系数都是1,从而实现最慢的收敛。为了达到同样的准确度,ratp(φ,tol)需要两倍于老鼠(φ,tol)

格式Phi =(1 +√(5))/2 tol = 1.0e-4 r = rat(Phi) p = ratp(Phi)
φ= 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 ))))))))))))))'
Tol = 0;lengthp = length(rat(phi,tol))
Lengthr = 154 lengthp = 297

DIY

(对于我的国际读者来说,DIY是“自己动手”的意思。)创建自己的ratp在一份拷贝里做了一个字的编辑matlab工具箱\ \ specfun \ rat.m.比较这两个函数√6 (2).警告:一切都不是第一眼看到的那样。




发布与MATLAB®R2018b

|

댓글

댓글을남기려면링크를클릭하여MathWorks계정에로그하거나계정을새로만드십시오。