当我的matlab代码到达该行时:
vE(:,:,i)=(mY(:,:,i))\(-mA*(vIs-mG(:,:,i)*vVs));
出现以下警告:
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate.
RCOND = 1.682710e-16.
怎么了?
完整代码:
function [ vE, vV_node, vI_node ] = ...
node_analysis( vIs, vVs, mA, mG, mY )
[A,B,N]=size(mY);
vE=zeros(4,1,N);
for i=1:N
vE(:,:,i)=(mY(:,:,i))\(-mA*(vIs-mG(:,:,i)*vVs));
vV_node(:,:,i)=mA'*vE(:,:,i);
vI_node(:,:,i)=mG(:,:,i)*vV_node(:,:,i)+(vIs-mG(:,:,i)*vVs);
end
end
vE=mY^-1 * (-mA*(cIs-mG*vVs))
vE is (4x1xN) size
mY(4x4xN)
mA(4x9)
vIs(9x1)
mG(9x9xN)
vVs(9x1)
答案 0 :(得分:1)
当您将\
运算符与矩阵一起使用时,MATLAB将尝试求解最小二乘问题,以估算等式x
中给定y
的{{1}}。根据A的大小和形状,如果没有其他信息,解决这个等式可能很容易,很难或不可能。这取决于你的具体问题。
正如Oli提到的评论,这是因为你的矩阵接近于奇异或其奇异值接近于零。 MATLAB正确告知您MATRIX可能有未知的信息会搞砸答案,或者MATRIX中的某些信息与小部分要解决的其他部分相比是如此之小{{1几乎不可能且容易出错。
根据您的数学背景,您可能会考虑我创建的以下cod创建一个非常小的值的矩阵。这将重现您的错误:
y = A*x
有多种方法可以开始尝试解决这个问题,通常是通过重新制定问题和/或添加某种正规化术语。不过,一个好的第一次尝试是添加一个简单的Tikhonov正则化,它将所有小值加到MATLAB可以使用的合理范围内。这可能会弄乱您的数据,但您可以使用它。
粗略地说,试试这个:
x
对于较大或较小的%% Make some data:
randn('seed', 1982);
n = 3;
A = zeros(n);
for ind = 1:n-1
v = randn(n,1);
A = A + v*v';
end
% Last bit is very tiny compared to the others:
A = A + 1e-14*randn(n,1)*randn(1,n);
%% Try and solve Ax=y for x= 1,2,3...
x = (1:n)';
y = A*x
x_est = A \ y
值,您会看到错误消失,但解决方案在某种程度上是错误的。您可能会发现这是否可以接受。
请注意,在我的示例中,答案是错误的,因为我使用了tikk = 1e-12;
x_est2 = (A + tikk * eye(n)) \ y
。当您增加问题大小tikk
时,您将获得更好的结果。
最后,要开始探索矩阵n=3
(n
)的错误,您可以考虑查看A
中(-mA*(vIs-mG(:,:,i)*vVs))
值的衰减速度。其中一些应该非常接近于零。此外,您可以看看Tihkonov正则化以及通过将矩阵实际分解为SVD并更好地扩展事物可以做些什么。