MATLAB社区

MATLAB,社区和更多

如何成为顶尖数学家

我认为自己是一个很好的厨师,但我不是顶级厨师。在《顶级大厨》节目中,参赛者必须完美地烹饪他们的食材,这就要求炉灶上的温度只有一度,烹饪时间精确到几秒。对我来说,我只是为了生存而竞争,而不是为了钱,所以我会选择美味和足够好而不是完美;如果它看起来有点像橡胶,那又怎样?

另一方面,计算机并没有“足够好”的固有概念。计算机要求完美和精确。幸运的是,编程语言(如MATLAB)为我们提供了简单的方法,可以轻松地实现一定程度的精度和可重复性。

要确定使用的精度并不总是容易的。例如,对于那些不熟悉IEEE浮点表示法的人来说,下面的方法可能会有令人惊讶的结果:

0.1 + 0.1 + 0.1 - 0.3
ans = 5.5511 e - 017

为什么我们会得到这个结果,当我们期望0时?乍一看,这两个数字看起来完全一样:

0.1 + 0.1 + 0.1
Ans = 0.3000

幸运的是,命令窗口有一个特殊的功能来帮助我们理解正在发生的事情。的格式函数控制“命令窗口”输出中的数字表示方式。

首先,我们可以尝试长格式。

格式0.1 + 0.1 + 0.1
Ans = 0.300000000000000

长格式给了我们很多额外的数字,但这仍然不能告诉我们这两个数字之间的区别。要看到区别,我们需要看看实际的64位浮点表示。

格式十六进制0.1 + 0.1 + 0.1
Ans = 3fd3333333333334

你可以看到这两个数字很接近,但并不完全相同。这样做的原因是为了在计算机上表示数字,我们必须抽样10^-308到10^+308之间的无限数量的数字,从而导致四舍五入。这个舍入误差是用两个连续数字之间的差来测量的,使用神奇的函数每股收益.对此有一个很好的解释technical note 1108.在程序流中,类型化数字和计算数字之间的微妙差别可能非常重要,例如with如果,语句。数字表示对于文件I/O也非常重要。

最基本的文本文件操作是使用.我们可以看到,使用默认的浮点表示,我们不会得到与开始时完全相同的数字。如果这些数字是系数,我们甚至可以在开始分析之前就破坏系统的稳定。

格式一个=兰德(5);fid = fopen (“data.dat”' w ');流(fid检测器,' % f ',);文件关闭(fid);fid = fopen (“data.dat”“r”);A2 = fscanf (fid,' % f '5 [5]);文件关闭(fid);马克斯(A-A2)
Ans = 1.0e-006 * 0.4303 0.4098 0.2859 0.2926 0.4377

再一次,十六进制表示法节省了时间。这里有一点小技巧,因为我选择从头到尾阅读人物fscanf.如果您在家里运行这段代码,请比较两个文本文件。第一个很好,人类可读,但第二个对计算机来说精确度最好。

fid = fopen (“data2.dat”' w ');流(fid检测器,“% bx”,);文件关闭(fid);fid = fopen (“data2.dat”“r”);A3 = fscanf (fid,“% c”[正]16日);文件关闭(fid);A3 = hex2num (A3);A3 =重塑(A3 5 5);马克斯(A-A3)
Ans = 0 0 0 0

这个问题也会发生在其他文本文件格式中,比如CSV。如果您使用的是windows, Microsoft Excel提供了一个很好的平衡,因为文件很容易读取,但数据是以二进制存储的。

csvwrite (“data.csv”,);A4 = csvread (“data.csv”);马克斯(a4的)xlswrite (“data.xls”,A) A5 = xlsread(“data.xls”);马克斯(A-A5)
Ans = 00 00

精度考虑不仅仅针对命令行函数。当从我们的gui和Simulink模型导入/导出时,应该记住它们。金宝app以我最喜欢的工具箱之一为例滤波器设计的工具箱.当我在技术支持部门工作时,我帮助一位客户解决了这个问题金宝app。在导出他的系数并将其导入另一个工具后,他看到了一个完全不同的过滤器。下面我捕获了输出窗口,其中有几个不同的输出格式选项。我们的大多数工具箱gui都有类似的选项,在没有选项的情况下,通常有一个命令行函数来设置所需的精度。

FDA工具导出选项

如果你只去和从MATLAB,保存数据时最好的结果,使用mat文件与保存和加载命令。为此,您可以使用工作区浏览器中的导出按钮。

工作区浏览器保存按钮

与之前的系列保持一致,保存负载也有一个很好的ASCII选项:

保存data.mat美国信息交换标准代码总价值一个A6 =负载(“data.mat”“ascii”);马克斯(A-A6)
Ans = 0 0 0 0

最后一个有趣的浮点微妙之处;有两个不同但相等的零。

格式十六进制0 = 0 -0 = -0
0 = 0000000000000000 - Zero = 8000000000000000
|

评论

要留下评论,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。