# How many solutions do you get from simultaneous polynomial equations?

I have the following four simultaneous polynomial equations

eqns = {4 a^2 k^2 (b^2 M1 M2 + I1 (M1 + M2) + I2 (M1 + M2)) ==
I1 I2 M1 M2 ω1^2 ω2^2,
4 c (a^2 + e^2) k (b^2 M1 M2 + I1 (M1 + M2) + I2 (M1 + M2)) ==
2 I1 I2 M1 M2 ζ2 ω1^2 ω2 +
2 I1 I2 M1 M2 ζ1 ω1 ω2^2,
2 (2 c^2 e^2 (b^2 M1 M2 + I1 (M1 + M2) + I2 (M1 + M2)) +
k (a^2 I2 M1 M2 + I1 ((a^2 + b^2) M1 M2 + I2 (M1 + M2)))) ==
I1 I2 M1 M2 ω1^2 +
4 I1 I2 M1 M2 ζ1 ζ2 ω1 ω2 +
I1 I2 M1 M2 ω2^2,
2 c (e^2 I2 M1 M2 + I1 ((b^2 + e^2) M1 M2 + I2 (M1 + M2))) ==
2 I1 I2 M1 M2 ζ1 ω1 +
2 I1 I2 M1 M2 ζ2 ω2};


The values of a, e, k and c are unknowns and I have values for the other parameters as follows

values = {M1 -> 4.8, M2 -> 2.1420000000000003, I1 -> 0.0090397,
I2 -> 0.0115032,
b -> 0.0275, ω1 -> 1212.851537626128, ω2 ->
1640.0348023828728, ζ1 -> 0.1848599246177704, ζ2 ->
0.11006812856373586};


I can use NSolve and table the results

solutions = NSolve[eqns /. values];
Style[TableForm[{a, e, k, c} /. solutions,
TableHeadings -> {Automatic, {"a", "e", "k", "c"}}], FontSize -> 8]


I have 24 solutions most of them complex. How can I determine the number of solutions to expect? Can finding the number of solutions be generalised for other similar polynomial equations I will be solving? Is there a function to do this?

Thanks

• Have you seen this? Commented Mar 14, 2016 at 18:47
• For this particular example, two of your equations are linear in one unknown, so you can Eliminate[eqns , {c,k}]. The result is a twelfth order polynomial in only e ( 12 solutions ), and an equation quadratic in a , so 2x12->24 . (I ran eliminate on a numerical example to get that.. ) Commented Mar 14, 2016 at 19:21
• @J.M. can you give the formula from that paper here? Commented Mar 14, 2016 at 19:22
• @J.M. That looks like the Bezout bound. For many common families of examples it is too high. Commented Mar 14, 2016 at 22:39
• An important question is "expect from what"? You have the number of solutions (assuming NSolve is correct). Are there parameters that you intend to vary? If so, what are the specifics? Commented Mar 14, 2016 at 22:41

For generic values of the parameters, the (complex and real) solution count will indeed be 24. One can see this simply by using a random substitution. This is a general method, albeit probabilistic.

eqns = {4 a^2 k^2 (b^2 M1 M2 + I1 (M1 + M2) + I2 (M1 + M2)) ==
I1 I2 M1 M2 ω1^2 ω2^2,
4 c (a^2 + e^2) k (b^2 M1 M2 + I1 (M1 + M2) + I2 (M1 + M2)) ==
2 I1 I2 M1 M2 ζ2 ω1^2 ω2 +
2 I1 I2 M1 M2 ζ1 ω1 ω2^2,
2 (2 c^2 e^2 (b^2 M1 M2 + I1 (M1 + M2) + I2 (M1 + M2)) +
k (a^2 I2 M1 M2 + I1 ((a^2 + b^2) M1 M2 + I2 (M1 + M2)))) ==
I1 I2 M1 M2 ω1^2 +
4 I1 I2 M1 M2 ζ1 ζ2 ω1 ω2 +
I1 I2 M1 M2 ω2^2,
2 c (e^2 I2 M1 M2 + I1 ((b^2 + e^2) M1 M2 + I2 (M1 + M2))) ==
2 I1 I2 M1 M2 ζ1 ω1 +
2 I1 I2 M1 M2 ζ2 ω2};

values = {M1 -> 4.8, M2 -> 2.1420000000000003, I1 -> 0.0090397,
I2 -> 0.0115032,
b -> 0.0275, ω1 -> 1212.851537626128, ω2 ->
1640.0348023828728, ζ1 -> 0.1848599246177704, ζ2 ->
0.11006812856373586};


From this we isolate the parameters and replace the values with random ones (in case the specific given values put us on a piece of the complex discriminant variety).

params = values[[All, 1]];
SeedRandom[12345];
randsubsts =


Now solve and count:

Timing[Length[NSolve[polys /. randsubsts]]]

(* Out[647]= {0.168101, 24} *)


The upshot is that for random sets of parameter values there will be 24 solutions. Moreover since the given set of values also gave the generic solution count, it follows that for an open neighborhood in parameter space, centered at those specific values, we still get 24 solutions (in other words, the count is stable with respect to small perturbations of the given set of values).

• Very helpful as always. Many thanks.
– Hugh
Commented Mar 15, 2016 at 15:54