【发布时间】:2017-06-14 09:35:43
【问题描述】:
我发现 Octave 无法准确地求解方程组。
k= [1.0000e+015, -2.6667e-001, 3.3333e-002;-2.6667e-001, 5.3333e-001, -2.6667e-001;3.3333e-002, -2.6667e-001, 2.3333e-001];
f = [0;6.66667;41.66667];
x = (k\f)
x1 = inv(k)*f
x = (k\f)给了
-3.8893e-031
-1.9136e+001
1.1192e+001
x1 = inv(k)*f给了
4.8339e-014
2.3752e+002
4.5003e+002
两个答案之间存在差异。只是为了检查其他软件是否可以解决它,我在python numpy中尝试过。
import numpy as np
k = np.array ([[1.0000e+015, -2.6667e-001, 3.3333e-002],[-2.6667e-001, 5.3333e-001, -2.6667e-001],[ 3.3333e-002, -2.6667e-001, 2.3333e-001]])
f = np.array([[0],[6.66667],[41.66667]])
x = np.linalg.solve(k, f)
print(x)
[[ 4.83388655e-14]
[ 2.37521517e+02]
[ 4.50034428e+02]]
它可以正确解决。
我想在倍频程中使用运算符\ 来求解方程(我想这是 MATLAB 中推荐的方法)。有什么建议吗?
在 Windows 上使用 Octave 4.2.x。
编辑:
为什么答案被否决?这是 GNU Octave 所说的 https://www.gnu.org/software/octave/:
与许多 Matlab 脚本兼容的插件
尝试在 MATLAB 中运行相同的脚本并自己思考。
评论者归咎于病态矩阵。一个好的求解器应该能够以足够的精度求解(就像 numpy 和 MATLAB 一样)。
【问题讨论】:
-
我不这么认为。它特定于八度运算符 \ 并且可能是该运算符的算法。其他方法有效,但不推荐。如果浮点数有问题,这两种方法都不行。
-
您在尝试这些时是否碰巧注意到警告? “警告:机器精度的矩阵奇异,rcond = 6.66612e-17”
-
是的,不过
numpy给出了更准确的答案。事实上,八度音程inv也有作用。查看 octave \ 和inv中的错误幅度,这两种方法都会发出警告。 -
这是一个条件非常差的矩阵。遇到重大错误也就不足为奇了。
-
我认为
k\f与inv(k)*f不同,而是在数值上更稳定的伪逆,即inv(k'k)*(k'f):这就是结果不同的原因。