# Solve system of equations with some knowns and unknowns in the same matrix

조회 수: 1(최근 30일)
Yusuf 2022년 10월 25일
댓글: David Goodmanson 2022년 10월 26일
I am trying to solve for x in the equation Ax=b in matlab, but not all elements of x and b are unknown. I know the value of a few elements in x, and the rest are unknown, and I know the value of the elements in b for the x values that are unknown (ex. if I know x1, I dont know b1. If I dont know x2, I know b2, etc.). How can I automatically and efficiently solve for all of the unknowns in both vectors without manually writing the problem out as a system of equations each time?

댓글을 달려면 로그인하십시오.

### 채택된 답변

Bruno Luong 2022년 10월 25일
편집: Bruno Luong 2022년 10월 25일
% Random example
A = rand(5,5);
x = rand(5,1),
x = 5×1
0.7978 0.8825 0.0743 0.2101 0.6719
b = A*x,
b = 5×1
1.4535 1.7942 1.2279 1.4185 1.3270
[m,n] = size(A);
% put NaN at the position where x is unknown;
xunknown = randperm(n,3);
x(xunknown) = NaN;
% same for b
bunknown = randperm(m,2);
b(bunknown) = NaN;
% Reconstruct unknown x and then b
xunknown = isnan(x);
bunknown = isnan(b);
x(xunknown)=A(~bunknown,xunknown)\(b(~bunknown)-A(~bunknown,~xunknown)*x(~xunknown))
x = 5×1
0.7978 0.8825 0.0743 0.2101 0.6719
b(bunknown)=A(bunknown,:)*x
b = 5×1
1.4535 1.7942 1.2279 1.4185 1.3270
##### 댓글 수: 2표시숨기기 이전 댓글 수: 1
Bruno Luong 2022년 10월 25일
The solution I give is applicable for all cases.

댓글을 달려면 로그인하십시오.

### 추가 답변(1개)

David Goodmanson 2022년 10월 26일
편집: David Goodmanson 2022년 10월 26일
Hi Yusuf,
I'm later on an answer (and losing the race more often, to the extent that there is a race, which to be honest there sometimes is), but here is a slightly different way.
% data
n = 7;
m = 3;
A = rand(n,n);
i = sort(randperm(n,m))'; % index of unknown x
j = setdiff(1:n,i)'; % index of unknown b, the complementary index to i
x = zeros(n,1);
x(j) = rand(size(j)) % known x, zeros elsewhere
b = zeros(n,1);
b(i) = rand(size(i)) % known b, zeros elsewhere
%solve
G = zeros(n,n);
G(:,i) = A(:,i);
G(j,j) = -eye(length(j));
g = b-A(:,j)*x(j);
z = G\g
% z is a vector of all the unknowns,
% x(i) for the i indices
% b(j) for the j indices
% check
x(i) = z(i); % insert unknowns into orginal x vector
b(j) = z(j); % insert unknowns into orginal b vector
A*x-b % should be small
##### 댓글 수: 2표시숨기기 이전 댓글 수: 1
David Goodmanson 2022년 10월 26일
Hi Bruno, that's a reasonable point about scaling part of the matrix I called G. I like the method because it gives all the unknowns in one go with backslash, different from the standard (and probably more foolproof) two-step process that you used.

댓글을 달려면 로그인하십시오.

### 범주

Find more on Matrix Indexing in Help Center and File Exchange

R2022b

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!