Solving large overdetermined system of equations
10 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Mohamed Abdelhameed
le 24 Mar 2018
Commenté : John D'Errico
le 26 Mar 2018
I am trying to solve an overdetermenind system of equations (45 equations with 18 unknowns) in the form of A*X = B; where: A = [8.19 0.3; 12.39 0.86; 16.15 1.68; 17.7 2.16; 24.6 8.33]; A is 5 rows, 2 columns
B = [0.85 3.8 0.225 0.175 0.05 0.05 0 1.919 0.165; 1.5 6.825 0.45 0.4 0.175 0.125 0.025 2.907 0.315; 3 7.625 0.9 1.05 0.475 0.225 0.1 3.823 0.544; 3.05 7.9 1.1 1.8 1.225 0.25 0.45 4.153 0.881; 5.1 12.95 1.975 3.65 3.075 0.25 1.075 4.045 1.217]; B is 5 rows, 9 columns
X = [a1 b1 c1 d1 e1 f1 g1 h1 i1;a2 b2 c2 d2 e2 f2 g2 h2 i2]; X is 2 rows, 9 columns
I need to solve X with the following constraints: sum (a1 to i1) = 1 & sum (a2 to i2) = 1 & all elements in X shall be higher than or equal to zero (non negative).
0 commentaires
Réponse acceptée
John D'Errico
le 24 Mar 2018
Modifié(e) : John D'Errico
le 24 Mar 2018
I almost always need to laugh out loud, when someone says they have a "large" system. That is not even close to large, by factors of thousands at least in the number of variables. If you said a million unknowns, yep, that is large. :)
But you seem confused even at that. First, you say 45x18. Then you say 5x2. Neither is large.
Actually, what you seem to have is a 5x2 system of equations, with 9 distinct right hand sides. So you have 9separate problems, each of which shares the same matrix A, so the same left hand side. You don't have 45 equations. Just 5 equations, solved 9 times, all essentially in one call.
And, wanting to do this?
X = [a1 b1 c1 d1 e1 f1 g1 h1 i1;a2 b2 c2 d2 e2 f2 g2 h2 i2]; X is 2 rows, 9 columns
A godawful bad idea.
Anyway, the way to solve ANY linear system of equations of the form A*X=B, large or small, is
X = A\B;
Note that this solves your problem, all 9 right hand sides at once. The result will be a 2x9 array.
3 commentaires
John D'Errico
le 26 Mar 2018
If you have the optimization toolbox, then use LSQLIN. Note that LSQLIN cannot solve all problems at once. So you will need to loop over the columns of B, creating one column of the result at each time through. But this is easy.
LSQLIN allows nonnegativity constraints, so you will provide LOWER bounds of [0 0] for each element.
LB = [0 0];
UB = [];
since you have no upper bounds. And of course, since there are no linear inequality constraints:
A = [];
b = [];
As well, LSQLIN allows you to specify the sum of the elements, as a linear equality constraint. So you would specify
Aeq = [1 1];
beq = 1;
to be passed in.
If you don't have the optimization toolbox (why would anyone not have that toolbox?) then this problem becomes more difficult, but not impossibly so.
Plus de réponses (0)
Voir également
Catégories
En savoir plus sur Linear Least Squares 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!