2016-02-11 70 views
0

我想在Scilab中实现一些已经固有的滤波器拟合程序。我试图通过invfreqz.m中的最小二乘算法计算滤波器系数。意识到我必须在一些几乎奇异的矩阵上计算左侧矩阵的划分。问题是Scilab从这个计算得到的结果与matlab不同,我无法解决这个问题。代码如下:左边划分:从matlab转移到scilab

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中获得相同的结果,但是我找不到解决方法,因为我不知道发生了什么。任何人都可能有想法甚至解决方案?

回答

2

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

+1

撰写的名为“复曲线拟合”的论文。如果有帮助,我在64位Windows机器和64位Linux机器上尝试了R2014A上的代码,并获得了两个来自相同代码的不同答案。 – hiandbaii

+0

感谢您的答案。正如所说的invfreqz.m,matlab信号处理函数使用了完全相同的算法,并给出了完全相同的警告。意味着matlab固有的方法也会产生不稳定的结果。我用这种方法安装了很多过滤器。 :)非常困惑...我在Matlab R2015A btw .. – user967493

0

如果将来的读者碰巧遇到相同的情况:我编写了一个测试传递函数,它偶然导致了一个奇异矩阵,这个函数无法用invfreqz.m中的算法确定地解决。对于那些有兴趣的人来说,该算法的根源在于EC Levy