Solving large number of equations
7 次查看(过去 30 天)
显示 更早的评论
I am having issues to solve like following equations. I request for help/ suggestion to solve this type of equations. Thanks!
syms X1 X2 X3 X4 X5 X6 X7 X8
p_11 = 1; p_12 = 2; p_13 = 3; p_14 = 4; p_15 = 5; p_16 = 6; p_17 = 7;
p_21 = 8; p_22 = 9; p_23 = 10; p_24 = 11; p_25 = 12; p_26 = 13; p_27 = 14;
p_31 = 15; p_32 = 16; p_33 = 17; p_34 = 18; p_35 = 19; p_36 = 20; p_37 = 21;
p_41 = 22; p_42 = 23; p_43 = 24; p_44 = 25; p_45 = 26; p_46 = 27; p_47 = 28;
p_51 = 29; p_52 = 30; p_53 = 31; p_54 = 32; p_55 = 33; p_56 = 34; p_57 = 35;
p_61 = 36; p_62 = 37; p_63 = 38; p_64 = 39; p_65 = 40; p_66 = 41; p_67 = 42;
p_71 = 43; p_72 = 44; p_73 = 45; p_74 = 46; p_75 = 47; p_76 = 48; p_77 = 49;
p_81 = 50; p_82 = 51; p_83 = 52; p_84 = 53; p_85 = 54; p_86 = 55; p_87 = 56;
C_1 = [4 3 5];
C_2 = [2 4 6];
C_3 = [5 6 8];
C_4 = [1 2 3];
C_5 = [2 3 4];
C_6 = [3 4 5];
C_7 = [2 3 5];
C_8 = [3 6 2];
for i = 1:length(C_1)
eq1(i) = p_11*X1 + p_12*X2 + p_13*X3 + p_14*X4 + p_15*X5 + p_16*X6 + p_17*X7*sin(X8) == C_1(i);
eq2(i) = p_21*X1 + p_22*X2 + p_23*X3 + p_24*X4 + p_25*X5 + p_26*X6 + p_27*X7*sin(X8) == C_2(i);
eq3(i) = p_31*X1 + p_32*X2 + p_33*X3 + p_34*X4 + p_35*X5 + p_36*X6 + p_37*X7*cos(X8) == C_3(i);
eq4(i) = p_41*X1 + p_42*X2 + p_43*X3 + p_44*X4 + p_45*X5 + p_46*X6 + p_47*X7*sin(X8) == C_4(i);
eq5(i) = p_51*X1 + p_52*X2 + p_53*X3 + p_54*X4 + p_55*X5 + p_56*X6 + p_57*X7*sin(X8) == C_5(i);
eq6(i) = p_61*X1 + p_62*X2 + p_63*X3 + p_64*X4 + p_65*X5 + p_66*X6 + p_67*X7*sin(X8) == C_6(i);
eq7(i) = p_71*X1 + p_72*X2 + p_73*X3 + p_74*X4 + p_75*X5 + p_76*X6 + p_77*X7*sin(X8) == C_7(i);
eq8(i) = p_81*X1 + p_82*X2 + p_83*X3 + p_84*X4 + p_85*X5 + p_86*X6 + p_87*X7 == C_8(i);
end
% Solve the system of equations
sol = solve([eq1, eq2, eq3, eq4, eq5, eq6, eq7, eq8], [X1, X2, X3, X4, X5, X6, X7, X8]);
% Display solutions
disp(sol)
0 个评论
采纳的回答
Walter Roberson
2024-3-15
syms X1 X2 X3 X4 X5 X6 X7 X8
p_11 = 1; p_12 = 2; p_13 = 3; p_14 = 4; p_15 = 5; p_16 = 6; p_17 = 7;
p_21 = 8; p_22 = 9; p_23 = 10; p_24 = 11; p_25 = 12; p_26 = 13; p_27 = 14;
p_31 = 15; p_32 = 16; p_33 = 17; p_34 = 18; p_35 = 19; p_36 = 20; p_37 = 21;
p_41 = 22; p_42 = 23; p_43 = 24; p_44 = 25; p_45 = 26; p_46 = 27; p_47 = 28;
p_51 = 29; p_52 = 30; p_53 = 31; p_54 = 32; p_55 = 33; p_56 = 34; p_57 = 35;
p_61 = 36; p_62 = 37; p_63 = 38; p_64 = 39; p_65 = 40; p_66 = 41; p_67 = 42;
p_71 = 43; p_72 = 44; p_73 = 45; p_74 = 46; p_75 = 47; p_76 = 48; p_77 = 49;
p_81 = 50; p_82 = 51; p_83 = 52; p_84 = 53; p_85 = 54; p_86 = 55; p_87 = 56;
C_1 = [4 3 5];
C_2 = [2 4 6];
C_3 = [5 6 8];
C_4 = [1 2 3];
C_5 = [2 3 4];
C_6 = [3 4 5];
C_7 = [2 3 5];
C_8 = [3 6 2];
for i = 1:length(C_1)
eq1(i) = p_11*X1 + p_12*X2 + p_13*X3 + p_14*X4 + p_15*X5 + p_16*X6 + p_17*X7*sin(X8) == C_1(i);
eq2(i) = p_21*X1 + p_22*X2 + p_23*X3 + p_24*X4 + p_25*X5 + p_26*X6 + p_27*X7*sin(X8) == C_2(i);
eq3(i) = p_31*X1 + p_32*X2 + p_33*X3 + p_34*X4 + p_35*X5 + p_36*X6 + p_37*X7*cos(X8) == C_3(i);
eq4(i) = p_41*X1 + p_42*X2 + p_43*X3 + p_44*X4 + p_45*X5 + p_46*X6 + p_47*X7*sin(X8) == C_4(i);
eq5(i) = p_51*X1 + p_52*X2 + p_53*X3 + p_54*X4 + p_55*X5 + p_56*X6 + p_57*X7*sin(X8) == C_5(i);
eq6(i) = p_61*X1 + p_62*X2 + p_63*X3 + p_64*X4 + p_65*X5 + p_66*X6 + p_67*X7*sin(X8) == C_6(i);
eq7(i) = p_71*X1 + p_72*X2 + p_73*X3 + p_74*X4 + p_75*X5 + p_76*X6 + p_77*X7*sin(X8) == C_7(i);
eq8(i) = p_81*X1 + p_82*X2 + p_83*X3 + p_84*X4 + p_85*X5 + p_86*X6 + p_87*X7 == C_8(i);
end
eqns = [eq1, eq2, eq3, eq4, eq5, eq6, eq7, eq8];
size(eqns)
symvar(eqns)
You have 24 equations in 8 variables, and you are trying to solve them for 8 variables.
% Solve the system of equations
sol = solve(eqns, [X1, X2, X3, X4, X5, X6, X7, X8]);
solve() will immediately give up on trying to solve the 24 equations for 8 variables.
% Display solutions
disp(sol)
If you are trying to do a least-squared fit then solve() of more equations than variables is the wrong way to do it.
3 个评论
Torsten
2024-3-16
编辑:Torsten
2024-3-16
"solve" from above says your system does not have a solution.
"fsolve" as a numerical solver also cannot find a solution for your system (see below).
As you can see, the Jacobian of your system has only rank 4 instead of rank 8. Thus it will be almost impossible to solve it for arbitrary right-hand sides.
p_11 = 1; p_12 = 2; p_13 = 3; p_14 = 4; p_15 = 5; p_16 = 6; p_17 = 7;
p_21 = 8; p_22 = 9; p_23 = 10; p_24 = 11; p_25 = 12; p_26 = 13; p_27 = 14;
p_31 = 15; p_32 = 16; p_33 = 17; p_34 = 18; p_35 = 19; p_36 = 20; p_37 = 21;
p_41 = 22; p_42 = 23; p_43 = 24; p_44 = 25; p_45 = 26; p_46 = 27; p_47 = 28;
p_51 = 29; p_52 = 30; p_53 = 31; p_54 = 32; p_55 = 33; p_56 = 34; p_57 = 35;
p_61 = 36; p_62 = 37; p_63 = 38; p_64 = 39; p_65 = 40; p_66 = 41; p_67 = 42;
p_71 = 43; p_72 = 44; p_73 = 45; p_74 = 46; p_75 = 47; p_76 = 48; p_77 = 49;
p_81 = 50; p_82 = 51; p_83 = 52; p_84 = 53; p_85 = 54; p_86 = 55; p_87 = 56;
C_1 = [4 3 5];
C_2 = [2 4 6];
C_3 = [5 6 8];
C_4 = [1 2 3];
C_5 = [2 3 4];
C_6 = [3 4 5];
C_7 = [2 3 5];
C_8 = [3 6 2];
for i = 1:length(C_1)
f1 = @(X1,X2,X3,X4,X5,X6,X7,X8) p_11*X1 + p_12*X2 + p_13*X3 + p_14*X4 + p_15*X5 + p_16*X6 + p_17*X7*sin(X8) - C_1(i);
f2 = @(X1,X2,X3,X4,X5,X6,X7,X8) p_21*X1 + p_22*X2 + p_23*X3 + p_24*X4 + p_25*X5 + p_26*X6 + p_27*X7*sin(X8) - C_2(i);
f3 = @(X1,X2,X3,X4,X5,X6,X7,X8) p_31*X1 + p_32*X2 + p_33*X3 + p_34*X4 + p_35*X5 + p_36*X6 + p_37*X7*cos(X8) - C_3(i);
f4 = @(X1,X2,X3,X4,X5,X6,X7,X8) p_41*X1 + p_42*X2 + p_43*X3 + p_44*X4 + p_45*X5 + p_46*X6 + p_47*X7*sin(X8) - C_4(i);
f5 = @(X1,X2,X3,X4,X5,X6,X7,X8) p_51*X1 + p_52*X2 + p_53*X3 + p_54*X4 + p_55*X5 + p_56*X6 + p_57*X7*sin(X8) - C_5(i);
f6 = @(X1,X2,X3,X4,X5,X6,X7,X8) p_61*X1 + p_62*X2 + p_63*X3 + p_64*X4 + p_65*X5 + p_66*X6 + p_67*X7*sin(X8) - C_6(i);
f7 = @(X1,X2,X3,X4,X5,X6,X7,X8) p_71*X1 + p_72*X2 + p_73*X3 + p_74*X4 + p_75*X5 + p_76*X6 + p_77*X7*sin(X8) - C_7(i);
f8 = @(X1,X2,X3,X4,X5,X6,X7,X8) p_81*X1 + p_82*X2 + p_83*X3 + p_84*X4 + p_85*X5 + p_86*X6 + p_87*X7 - C_8(i);
f = @(X)[f1(X(1),X(2),X(3),X(4),X(5),X(6),X(7),X(8));
f2(X(1),X(2),X(3),X(4),X(5),X(6),X(7),X(8));
f3(X(1),X(2),X(3),X(4),X(5),X(6),X(7),X(8));
f4(X(1),X(2),X(3),X(4),X(5),X(6),X(7),X(8));
f5(X(1),X(2),X(3),X(4),X(5),X(6),X(7),X(8));
f6(X(1),X(2),X(3),X(4),X(5),X(6),X(7),X(8));
f7(X(1),X(2),X(3),X(4),X(5),X(6),X(7),X(8));
f8(X(1),X(2),X(3),X(4),X(5),X(6),X(7),X(8))];
X = sym('X',[8 1]);
J = jacobian(f(X))
rank(J)
X0 = [1;2;3;4;5;6;7;8];
sol(i,:) = fsolve(f,X0)
end
更多回答(1 个)
John D'Errico
2024-3-15
编辑:John D'Errico
2024-3-15
- This is not even a remotely large number of equations.
- Will you please learn to use matrices?
- X8 appears in only one form in your equations, as X7*sin(X8). Therefore, you could transform the problem trivially, by substituting a single new unknown into the problem. That is...
Y8 = X7*sin(X8).
Replace the product X7*sin(X8) in each place it appears in your system. Your system is now linear, in the set of unknowns {X1,X2,X3,X4,X5,X67,X7,Y8}. Solve that LINEAR system. Once you have found the values of X7 and Y8, you can recover X8.
X8 = asin(Y8/X7)
Remember this means there will be infinitely many equivalent solutions, but so what? And of course, if X7 were exactly zero, then no solution exists. Finally, if it is true that abs(Y8/X7)>1, then the only solutions possible will be complex solutions. Such is life.
So just use backslash to solve the problem. AND PLEASE LEARN TO USE MATRICES.
3 个评论
Torsten
2024-3-15
X7*cos(X8) in eq3 and p_87*X7 in eq8 unfortunately hinder to convert the system to a linear one.
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Polynomials 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!