solve linear equation system with partially unknown coefficient matrix
7 次查看(过去 30 天)
显示 更早的评论
Hello everybody,
I have a question concerning solving linear equation systems with matlab. Concidering I have an equation system: A*x=y.
x and y are column vectors, where all entrys are known. The data for x und y are measured values.
A is a square matrix, which is diagonal symmetric: . Also the matrix is linearly independent. I know, that some coefficients have to be 0.
Is there any way to solve this equation system in Matlab to get the missing coefficients of A?
In this example there are 8 unknown coefficients, but only 4 rows.
I have to say, that for x and y there are different measurements available, so I could expand these vectors to matrices:
I thought about a solution approach like least absolute deviation, but I don't know, how to consider in matlab the conditions:
- zero elements
- symmetric matrix
Is there any way to solve this problem? At the moment I'm not sure, if this is possible at all?
Thank you for your help!
2 个评论
John D'Errico
2020-10-23
编辑:John D'Errico
2020-10-23
Knowing that some coefficients must be zero is not what linearly independent means or implies.
Regardless, the solution posed by Bruno, which uses kron to essentially unroll the elements of A is the approach I would use. I believe I could also have solved the problem using symbolic algebra, to create a linear system in those unknowns. The result would be converted to a system of linear equations, solved using linear algebra. But used properly, kron is a better solution, because it never requires you to go into the symbolic domain - that would be much slower.
采纳的回答
Bruno Luong
2020-10-23
编辑:Bruno Luong
2020-10-23
Just using linear algebra, no extra tollbox is needed, of course n==1 is underdetermined problem
% Generate random matrix
n = 10;
L = rand(4);
A = L+L.';
A(3,1)=0;
A(4,2)=0;
A(2,4)=0;
A(1,3)=0;
A
% And X/Y data compatible with equation
X = rand(4,n)
Y = A*X;
clear A
% Engine
% Enforce symmetric
ij = nchoosek(1:4,2);
i = ij(:,1);
j = ij(:,2);
ku = sub2ind([4 4],i,j);
kl = sub2ind([4 4],j,i);
p = size(ij,1);
R = (1:p)';
M = kron(X.',eye(4));
sz = [p size(M,2)];
C = accumarray([R ku(:)],1,sz) + accumarray([R kl(:)],-1,sz);
% Enforce A(3,1) & ... A(4,2) == 0
K = sub2ind([4 4],[3, 4], ...
[1, 2]);
sz = [2 size(M,2)];
C0 = accumarray([(1:2)', K(:)],1, sz);
C = [C; C0];
p = size(C,1);
% Solve least squares with linear constraints
z = [M'*M, C';
C, zeros(p)] \ [M'*Y(:); zeros(p,1)];
A = reshape(z(1:16),4,4)
5 个评论
Bruno Luong
2020-10-26
编辑:Bruno Luong
2020-10-26
Least_squares with extra constraints
A(i,j) <= 0 for i~=j
A(i,i)>=0
% Generate random matrix
n = 10;
L = rand(4);
A = L+L.';
A = A.*(2*eye(4)-1);
A(3,1)=0;
A(4,2)=0;
A(2,4)=0;
A(1,3)=0;
A
% And X/Y data compatible with equation
X = rand(4,n)
Y = A*X;
% Y = Y+0.1*randn(size(Y));
clear A
% Engine
M = kron(X.',eye(4));
[I,J] = ndgrid(1:4);
I = I(:);
J = J(:);
b = I<=J & ~ismember([I,J], [1 3; ...
2 4], 'rows');
I = I(b);
J = J(b);
ku = sub2ind([4 4],I,J);
kl = sub2ind([4 4],J,I);
p = size(I,1);
R = (1:p)';
sz = [size(M,2) p];
isd = I==J;
P = accumarray([ku, R; ...
kl, R; ...
ku, R], [isd-1; isd-1; isd], sz);
z = lsqnonneg(M*P, Y(:));
A = reshape(P*z,4,4)
(Note: This is the last time I answered to a modified question.)
更多回答(1 个)
Ameer Hamza
2020-10-23
One approach is to find a least square solution using fmincon()
x = rand(4, 1);
y = rand(4, 1);
A = @(a) [a(1) a(2) 0 a(3);
a(2) a(4) a(5) 0;
0 a(5) a(6) a(7);
a(3) 0 a(7) a(8)];
objFun = @(a) sum((A(a)*x-y).^2, 'all');
sol = fmincon(objFun, rand(8,1))
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Logical 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!