Re: non linear system with 8 equations
- To: mathgroup at smc.vnet.net
- Subject: [mg117197] Re: non linear system with 8 equations
- From: Daniel Lichtblau <danl at wolfram.com>
- Date: Fri, 11 Mar 2011 04:33:28 -0500 (EST)
wiso wrote:
> I've a non linear system with 8 equation:
>
> solution = Solve[{n == ng + nn,
> na == eag ng + ean nn,
> nb == ebg ng + ebn nn,
> nc == ecg ng + ecn nn,
> nab == kabg eag ebg ng + kabn ean ebn nn,
> nac == kacg eag ecg ng + kacn ean ecn nn,
> nbc == kbcg ebg ecg ng + kbcn ebn ecn nn,
> nabc == kabcg eag ebg ecg ng + kabcn ean ebn ecn nn }, {ng, nn,
> eag, ebg, ecg, ean, ebn, ecn}];
>
> my pc is cogitating since more than one hour. Is there some method to
> speed it up? All variables are real, n* are positive integer, e* are
> real 0<e*<1. k* are known parameters
I doubt Solve will have any chance with this. It would need to compute
some flavor of GroebnerBasis, and that seems to be a difficult
undertaking for this system.
If you provide explicit numeric values for those parameters then NSolve
will handle it. Below is some code for this. It takes the polynomials,
variables of interest, parameter substitutions, and constraints entered
as a list.
In[160]:=
constrainedSolutions[polys_, vars_, paramsubs_, constraints_] :=
Module[
{solns},
solns = NSolve[polys /. paramsubs, vars];
Pick[solns, Quiet[And @@@ Release[constraints /. solns]]
]]
Here is your example. I changed the constraints so as to find parameter
substitutions that might yield a few valid solutions. I show one such
run below.
In[161]:=
eqns = {n == ng + nn, na == eag ng + ean nn, nb == ebg ng + ebn nn,
nc == ecg ng + ecn nn, nab == kabg eag ebg ng + kabn ean ebn nn,
nac == kacg eag ecg ng + kacn ean ecn nn,
nbc == kbcg ebg ecg ng + kbcn ebn ecn nn,
nabc == kabcg eag ebg ecg ng + kabcn ean ebn ecn nn};
polys = Apply[Subtract, eqns, 1];
vars = {ng, nn, eag, ebg, ecg, ean, ebn, ecn};
params = Complement[Variables[polys], vars];
paramsubs = Thread[params -> RandomReal[{-10, 10}, Length[params]]];
SeedRandom[11111];
constraints =
Flatten[{Map[Hold[Head[#] === Real] && # >= 0 &, {ng, nn}],
Map[Hold[Head[#] === Real] && -100 <= # <= 100 &, {eag, ebg, ecg,
ean, ebn, ecn}]}];
In[168]:= constrainedSolutions[polys, vars, paramsubs, constraints]
Out[168]= {{ng -> 7.30836, nn -> 0.254874, eag -> 0.186697,
ebg -> -0.90457, ecg -> -0.0648619, ean -> 2.44744, ebn -> 0.726247,
ecn -> -2.57797}, {ng -> 4.8318, nn -> 2.73144, eag -> -0.428736,
ebg -> -1.02281, ecg -> -0.46866, ean -> 1.48632, ebn -> -0.543236,
ecn -> 0.414936}, {ng -> 1.00957, nn -> 6.55367, eag -> -0.174131,
ebg -> -3.37666, ecg -> -4.50395, ean -> 0.330202, ebn -> -0.460332,
ecn -> 0.521227}}
If you know a priori that your system will have exactly one solution
satisfying the constraints, then you might do better using FindRoot with
appropriate initial values for the variables. But for this particular
system of polynomials NSolve will be fast (again, provided you give
numerical values up front for the parameters).
Daniel Lichtblau
Wolfram Research