我发现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脚本兼容的Drop-in
尝试在MATLAB中运行相同的脚本并自己思考。
评论者指责病态矩阵。一个好的求解器应该能够以足够的精度求解(如numpy和MATLAB那样)。
答案 0 :(得分:2)
总结:Octave开发人员选择退回"最小规范解决方案"对于(标记的)奇异方程组。
===============
k
的第一个元素比其他元素大得多,而f
的相应字词为0. x1
解决方案
4.8339e-014
2.3752e+002
4.5003e+002
第一个词实际上是0。
对剩余的2x2矩阵执行求解,产生相同的值:
>> inv(k(2:end,2:end))*f(2:end)
ans =
237.52
450.03
>> k(2:end,2:end)\f(2:end)
ans =
237.52
450.03
和numpy
:
In [518]: np.linalg.solve(k[1:,1:],f[1:])
Out[518]:
array([[ 237.52151737],
[ 450.0344278 ]])
=================
出于某种原因,\
求解器对矩阵奇点更敏感。
>> k\f
warning: matrix singular to machine precision, rcond = 6.66612e-17
warning: matrix singular to machine precision, rcond = 6.66612e-17
是的,测试此解决方案表明它已经离开了
>> k*(k\f)
ans =
5.4761
-13.1904
7.7144
>> rcond(k)
ans = 6.6661e-17
>> rcond(k(2:end,2:end))
ans = 0.083327
我不确定这一点的重要性,但numpy
lstsqr
解算器会返回与k\f
相同的错误值:
In [525]: np.linalg.lstsq(k,f)
Out[525]:
(array([[ -3.88925778e-31],
[ -1.91360857e+01],
[ 1.11917602e+01]]),
array([], dtype=float64),
2,
array([ 1.00000000e+15, 6.89292234e-01, 7.73677656e-02]))
>> pinv(k)*f # Moore-Penrose pseudoinverse
ans =
-3.8893e-31
-1.9136e+01
1.1192e+01
http://savannah.gnu.org/bugs/?42181 - 声称这是记录在案的。对于单数,或不足或超定方程,Octave返回"最小范数解决方案",而不是"基本解决方案" (MATLAB的选择)。
http://wiki.octave.org/FAQ#Solvers_for_singular.2C_under-_and_over-determined_matrices