Michael hat natuerlich das Thema eigentlich schon erschoepfend behandelt,
aber hier eine kleine Anmerkung, dass man (fuer lineare Systeme) auch recht
einfach ein simples Programm schreiben kann (kein Anspruch auf perfekte Programmierung
hier ;-)), dass solche Probleme (meistens) erfolgreich und schnell loest:
In[1]:= <<LSolve`
In[2]:= eqn = Flatten[{
{ C12+C13*C23/(C13+C23) == C10*C20/(C10+C20) },
{ C13+C12*C23/(C12+C23) == C10*C30/(C10+C30) },
{ C23+C12*C13/(C12+C23) == C20*C30/(C20+C30) } }];
In[3]:= LSolve[eqn, {C10, C20, C30}]//Timing//InputForm
Out[3]//InputForm=
{0.5*Second, {C10 ->
(2*(C12*C13 + C12*C23 + C13*C23)*(C12*C13 + C12*C23 + C23^2))/
(C12*C13^2 + C12*C13*C23 + 2*C12*C23^2 + 2*C23^3),
C20 -> (2*(C12*C13 + C12*C23 + C13*C23)*(C12*C13 + C12*C23 + C23^2))/
(C13*(C12*C13 + 3*C12*C23 + 2*C23^2)),
C30 -> (2*(C12*C13 + C12*C23 + C13*C23)*(C12*C13 + C12*C23 + C23^2))/
(C12*(C13 + C23)*(2*C12 - C13 + 2*C23))}}
In[4]:= !!LSolve.m
(* :Title: LSolve *)
(* :Summary: LSolve is like Solve, but only for linear equations *)
BeginPackage["LSolve`"];
LSolve::usage=
"LSolve is equivalent to Solve, except that it works only for
linear equations (and returns just a list)
and uses the High-school algorithm and is sometimes better than
Solve for rational polynomial systems.";
$VeryVerbose::usage=
"$VeryVerbose is a global variable with default value 0.
Setting it to 1 or 2 displays intermediate informations
during the calculation.";
Begin["`Public`"]; $VeryVerbose=0;
LSolve[a_ /; Head[a] =!= List, b__] := LSolve[{a}, b];
LSolve[eqq_List, cli_List, ops___Rule] := Block[
{newel,lneq,neqh,neq,newneq,col,coll,new,res = {},leq=Length[eqq]},
col[x_] := Collect[x, cli, Cancel[Factor[#]]&];
specsimp[{}, b_Rule] := {b}; specsimp[a_List, b_Rule] :=
Map[(#[[1]] -> (coll[#[[2]] /. b]))&, a] /. coll -> col;
neq = eqq /. Equal[a_, b_] :> (a-b);
For[i = 1, i <= leq, i++,
If[!FreeQ[neq, cli[[i]]],
While[FreeQ[neq1 = col[neq[[1]] /. res], cli[[i]]],
If[$VeryVerbose > 1, Print["rotating ", i]];
neq = RotateLeft[neq = Prepend[Rest[neq],neq1]] ];
new = Solve[neq1==0, cli[[i]]][[1,1]];
If[$VeryVerbose > 0, Print["solved ",new//InputForm]];
new = new[[1]] -> Collect[new[[2]], cli, Cancel[Factor[#]]&];
neq = Rest[neq];
If[i>1, res = Append[specsimp[res, new], new], res = {new}];
If[i < leq, If[ $VeryVerbose > 1, Print["UPDATING"] ];
newneq = {}; neqh = Hold@@{neq}; lneq = Length[neq];
For[iij = 1, iij <= lneq, iij++,
If[$VeryVerbose > 1,Print["updating ", iij, " out of ",lneq]];
newel = neqh[[1, iij]] /. res;
If[newel === neqh[[1, iij]], AppendTo[newneq, newel],
AppendTo[newneq, col[newel]]
]; Clear[newel]; ];
neq = newneq]]]; res];
End[]; EndPackage[];
In[4]:= Simplify/@(eqn/.Last[%])
Out[4]= {True, True, True}
Rolf Mertig
|