Re: non linear system with 8 equations
- To: mathgroup at smc.vnet.net
- Subject: [mg117210] Re: [mg117182] non linear system with 8 equations
- From: Ruggero <giurrero at gmail.com>
- Date: Fri, 11 Mar 2011 04:35:51 -0500 (EST)
- References: <201103102103.QAA11337@smc.vnet.net> <4D79634E.6020600@wolfram.com>
2011/3/11 Daniel Lichtblau <danl at wolfram.com>:
> 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, n=
n,
>> 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 so=
me
> 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 w=
ill
> handle it. Below is some code for this. It takes the polynomials, variabl=
es
> 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 sys=
tem
> of polynomials NSolve will be fast (again, provided you give numerical
> values up front for the parameters).
>
> Daniel Lichtblau
> Wolfram Research
>
Thank you for the reply (why didn't you post it on the ng?). Well, I
know I can find a numberical solution very quickly, but I need to find
a closed formula, even expressed as root of a n degree polynomial. My
big problem is that every know number is known with an error, as n +/-
delta n, and I want to propagate every error in the solution.
- References:
- non linear system with 8 equations
- From: wiso <giurrero@gmail.com>
- non linear system with 8 equations