solve linear equation system with partially unknown coefficient matrix
조회 수: 5 (최근 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!