关于数学:左侧除法:从Matlab转移到scilab

left side division: transfering from matlab to scilab

我正在尝试在Scilab中实现一些Matlab固有的过滤器拟合例程。我正在尝试通过invfreqz.m中的最小二乘算法来计算滤波器系数。要意识到我必须在一些几乎奇异的矩阵上计算左侧矩阵的除法。问题是Scilab从此计算中得出的结果与matlab产生的结果不同,我无法解决问题。代码如下:

1
2
3
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给我结果:

1
2
3
4
5
6
result =
 -0.5078
  0.5078
 -1.0000
  0.5078
 -0.5078

和Scilab产量:

1
2
3
4
5
6
result  =
  0.00000000000000050  
  0.                  
- 0.99999999999999856  
  0.                  
- 0.00000000000000219

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

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

具有不同的rcond值

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

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


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


如果问题像您一样病情严重,则没有数值算法可以提供准确的结果。

A \\\\ B操作上的错误可以通过

估算

1
 norm(B)*%eps*cond(A)

如果将来的读者碰巧遇到相同的情况:我组成了一个测试传递函数,偶然导致了一个奇异矩阵,而invfreqz.m中找到的算法无法确定地解决这个问题。对于那些感兴趣的人,该算法源于E.C. Levy

撰写的名为"复杂曲线拟合"的论文