左侧分裂:从matlab转移到scilab

时间:2016-02-11 19:42:15

标签: matlab math signal-processing least-squares scilab

我试图在Scilab中实现一些已经是Matlab固有的过滤器拟合程序。我试图通过最小平方算法计算滤波器系数,如invfreqz.m。要意识到我必须在一些近似奇异矩阵上计算左侧矩阵除法。问题是Scilab产生的计算结果与matlab不同,我无法解决问题。代码如下:

matrix = [336.1810  331.8898  331.8898  336.1810  331.8898; 331.8898  336.1810  320.9743  331.8898  336.1810; 331.8898  320.9743  336.1810  331.8898  320.9743; 336.1810  331.8898  331.8898  336.1810  331.8898; 331.8898  336.1810  320.9743  331.8898  336.1810];
vector = [-331.8898; -320.9743; -336.1810; -331.8898;  -320.9743];
result = matrix \ vector;

Matlab给了我结果:

result =
 -0.5078
  0.5078
 -1.0000
  0.5078
 -0.5078

和Scilab产量:

result  =
  0.00000000000000050  
  0.                   
- 0.99999999999999856  
  0.                   
- 0.00000000000000219  

使用这两种软件执行计算会给我一个警告:

> Warning: Matrix is close to singular or badly scaled.

具有不同的rcond值

matlab: RCOND =  1.703907e-17
Scilab: rcond=   0.0000D+00

我检查了Matlab的invfreq.m并且他们以完全相同的方式完成,但结果与Scilab不同。甚至警告也显示出来。 :)现在我需要在Scilab中获得相同的结果,但我无法找到解决方法,因为我不知道发生了什么。任何人都可能有想法甚至解决方案?

3 个答案:

答案 0 :(得分:2)

结果在数值上不稳定。你不应该在任何一个答案中放任何股票。

答案 1 :(得分:1)

如果问题像您一样得病,则没有数值算法能够提供准确的结果。

A \ B操作错误可以通过

估算
 norm(B)*%eps*cond(A)

答案 2 :(得分:0)

如果未来的读者碰巧遇到同样的情况:我组成了一个测试传递函数,它意外地产生了一个奇异矩阵,无法用invfreqz.m中的算法确定地解决。对于那些感兴趣的人来说,算法源于一篇名为“#34;复杂曲线拟合”的论文。由E.C. Levy撰写