【发布时间】:2019-09-20 18:43:15
【问题描述】:
我正在使用 4Rungekutta 来解决 MATLAB 和 C 中的 DGL(Ax + Bu = x_dot), A 是 5x5,x 是 5x1,B 5x1,u 1x1,u 是正弦函数的输出(2500 点), MATLAB 和 C 中 4Rungekutta 的输出在第 45 次迭代之前都是相同的,但是在 4Rungekutta 的第 45 次(2500 次迭代中)迭代时,4Rungekutta 的第 2 步的 A*x 的输出是不同的,它们是矩阵。 我用 30 位小数打印它们 A和x在MATLAB和C中是一样的
A = [0, 0.100000000000000005551115123126,0,0,0;
-1705.367199390822406712686643004417 -13.764624913971095665488064696547 245874.405372532171895727515220642090 0.000000000000000000000000000000 902078.458362009725533425807952880859;
0, 0, 0, 0.100000000000000005551115123126, 0;
2.811622989796986438193471258273, 0, -572.221510883482778808684088289738, -0.048911651728553134921284595293 ,0;
0, 0, -0.100000000000000005551115123126 0, 0]
x = [0.071662614269441649028635765717 ;
45.870073568955461951190955005586;
0.000002088948888569741376840423;
0.002299524406171214990085571728;
0.000098982102875767145086331744]
但是A*x的结果不一样,MATLAB中第二个元素是-663.792187417201375865261070430279,C中是 -663.792187417201489552098792046309
MATLAB
A*x = [ 4.587007356895546728026147320634
-663.792187417201375865261070430279
0.000229952440617121520692600622
0.200180438762844026268084007825
-0.000000208894888856974158859866];
C
A*x = [4.587007356895546728026147320634
-663.792187417201489552098792046309
0.000229952440617121520692600622
0.200180438762844026268084007825
-0.000000208894888856974158859866];
虽然差异很小,但我需要这个结果来做有限差分,此时结果会更明显
有人知道为什么吗?
【问题讨论】:
-
很可能你遇到了这样的事情:stackoverflow.com/questions/11151609/…
-
你没有显示代码,所以我们只能胡乱猜测。我的猜测是四舍五入是不同的,因为操作的顺序不同。令人惊讶的是,您在前 45 次迭代中看不到任何差异,真的。重要的问题是:您在其中一种实现中得到错误的结果吗?
-
@Cris Luengo,我在 c 处得到了错误的结果,因此我无法得到正确的渐变。这也让我困惑了几天,如果是舍入误差,为什么不同之处出现在第 45 次迭代而不是第一次迭代
-
这不是一个错误的结果,它只是一个不同的四舍五入(最后一个有效数字不同,你显示的所有其他数字都是没有意义的,双精度数大约有 15 个小数位)。这种差异不会显着影响您的结果。你不能指望两个程序产生相同的浮点结果。请参阅上面链接的问答。