Octave不准确地求解线性方程组?

时间:2017-01-28 22:10:08

标签: matlab numpy octave

我发现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那样)。

1 个答案:

答案 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