solve linear equation system with partially unknown coefficient matrix
7 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
J_Automotive
le 23 Oct 2020
Modifié(e) : Bruno Luong
le 26 Oct 2020
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 commentaires
John D'Errico
le 23 Oct 2020
Modifié(e) : John D'Errico
le 23 Oct 2020
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.
Réponse acceptée
Bruno Luong
le 23 Oct 2020
Modifié(e) : Bruno Luong
le 23 Oct 2020
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 commentaires
Bruno Luong
le 26 Oct 2020
Modifié(e) : Bruno Luong
le 26 Oct 2020
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.)
Plus de réponses (1)
Ameer Hamza
le 23 Oct 2020
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))
2 commentaires
Voir également
Catégories
En savoir plus sur Logical dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!