MATLAB社区

MATLAB,社区等

如何成为顶尖数学家

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

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

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

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

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

0.1 + 0.1 + 0.1 0.3
Ans = 0.3000 Ans = 0.3000

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

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

格式0.1 + 0.1 + 0.1 0.3
Ans = 0.300000000000000 Ans = 0.300000000000000

长格式给了我们很多额外的数字,但这仍然没有显示出这两个数字之间的差异。要了解区别,我们需要看看实际的64位浮点表示法。

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

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

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

格式A = rand(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 0

其他文本文件格式(如CSV)也可能出现此问题。如果您使用的是windows, Microsoft Excel提供了一个很好的平衡,因为文件易于阅读,但数据是以二进制存储的。

csvwrite (“data.csv”,);A4 = csvread(“data.csv”);马克斯(a4的)xlswrite (“data.xls”,A) A5 = xlsread(“data.xls”);马克斯(A-A5)
Ans = 1.0e-005 * 0.4092 0.3846 0.2146 0.4540 0.4040 Ans = 00 00 00

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

工具出口选项

如果您只进出MATLAB,为了在保存数据时获得最佳结果,请使用带有save和load命令的mat文件。为此,您可以使用工作区浏览器中的导出按钮。

工作区浏览器保存按钮

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

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

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

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

评论

要发表评论,请点击此处登录到您的MathWorks帐户或创建一个新帐户。