我有n
实数变量(不知道,不在乎),我们称它们为X[n]
. 我也有m >> n
他们之间的关系,我们称他们R[m]
为 ,形式为:
X[i] = alpha*X[j]
,alpha
是一个非零正实数,i
并且j
是不同的,但该(i, j)
对不一定是唯一的(即具有不同 alpha 因子的相同变量之间可能存在两种关系)
我正在尝试做的是找到一组alpha
参数,以某种最小二乘的方式解决超定系统。理想的解决方案是最小化每个方程参数与其选择值之间的差异平方和,但我对以下近似值感到满意:
如果我将 m 个方程转换为 n 个未知数的超定系统,任何基于伪逆的数值求解器都会给我一个明显的解(全为零)。所以我目前所做的是在混合中添加另一个方程x[0] = 1
(实际上任何常数都可以)并使用 Moore-Penrose 伪逆以最小二乘法求解生成的系统。虽然这试图最小化 的总和(x[0] - 1)^2
和 的平方和x[i] - alpha*x[j]
,但我发现它是我的问题的一个很好且数值稳定的近似值。这是一个例子:
a = 1
a = 2*b
b = 3*c
a = 5*c
在八度:
A = [
1 0 0;
1 -2 0;
0 1 -3;
1 0 -5;
]
B = [1; 0; 0; 0]
C = pinv(A) * B or better yet:
C = pinv(A)(:,1)
a
这会产生, b
, c
:的值,[0.99383; 0.51235; 0.19136]
这给了我以下(合理的)关系:
a = 1.9398*b
b = 2.6774*c
a = 5.1935*c
所以现在我需要在 C/C++/Java 中实现这个,我有以下问题:
有没有更快的方法来解决我的问题,或者我在生成超定系统和计算伪逆方面是否走在正确的轨道上?
m
我目前的解决方案需要一个奇异值分解和三个矩阵乘法,考虑到可能是 5000 甚至 10000有点多。是否有更快的方法来计算伪逆(实际上,我只需要它的第一列,而不是给定矩阵的稀疏性(每行恰好包含两个非零值,其中一个始终为一个,另一个始终为负)
您建议为此使用哪些数学库?LAPACK好吗?
我也对任何其他建议持开放态度,只要它们在数值上稳定且渐近快速(比如说k*n^2
,哪里k
可以很大)。