consider the following problem:
costsHome[yh_, yht_] := w (yh^2 + 10/100 yh yht + 110/100 yht^2);
costsFor[yf_, yft_] := wt (110/100 yf^2 + 10/100 yf yft + yft^2);
profitHome[\[Epsilon]_, pht_, ph_] := \[Epsilon] pht yht + ph yh -
costsHome[yh, yht];
profitFor[\[Epsilon]_, pf_, pft_] :=
1/\[Epsilon] pf yf + pft yft - costsFor[yf, yft];
res = Solve[{D[profitHome[\[Epsilon], pht, ph], yh] == 0,
D[profitHome[\[Epsilon], pht, ph], yht] == 0,
D[profitFor[\[Epsilon], pf, pft], yf] == 0,
D[profitFor[\[Epsilon], pf, pft], yft] == 0}, {yh, yht, yf, yft}]
The list of results I get is sorted not in the way I would like to
have it, i.e. yh, yht, yf and yft.
How do I always the the list to be the way I want it?
The order even changes if I let
costsHome[yh_, yht_] := w (yh^2 + yht^2);
costsFor[yf_, yft_] := wt (yf^2 + yft^2);
Does anybody know why? Thanks in advance.
res = Solve[{D[profitHome[\[Epsilon], pht, ph], yh] == 0,
D[profitHome[\[Epsilon], pht, ph], yht] == 0,
D[profitFor[\[Epsilon], pf, pft], yf] == 0,
D[profitFor[\[Epsilon], pf, pft], yft] == 0}, {yh, yht, yf, yft},
Sort -> False]
but it may have a cost. Solve chooses an ordering of the variables that
it believes will be the most efficient and the answer is returned in
this particular order. Probably Solve is going to be more often right
than wrong so setting the Sort option to False may give you poorer
performance (but it may also not).
The alternative is to let Solve choose its own ordering and then sort
the answers to put them in the order you want them to be. It's easy
enough to program this but I don't think it is worth bothering about
unless you find that the simple solution above seriously damages
performance.
Andrzej Kozlowski
7.0 for Mac OS X x86 (64-bit) (February 19, 2009)
costsHome[yh_, yht_] :=
w (yh^2 + 10/100 yh yht + 110/100 yht^2);
costsFor[yf_, yft_] :=
wt (110/100 yf^2 + 10/100 yf yft + yft^2);
profitHome[\[Epsilon]_, pht_, ph_] :=
\[Epsilon] pht yht + ph yh -
costsHome[yh, yht];
profitFor[\[Epsilon]_, pf_, pft_] :=
1/\[Epsilon] pf yf + pft yft - costsFor[yf, yft];
res = Solve[{
D[profitHome[\[Epsilon], pht, ph], yh] == 0,
D[profitHome[\[Epsilon], pht, ph], yht] == 0,
D[profitFor[\[Epsilon], pf, pft], yf] == 0,
D[profitFor[\[Epsilon], pf, pft], yft] == 0},
{yh, yht, yf, yft}][[1]];
First /@ res
{yh,yht,yf,yft}
To force a specified order
desiredOrder = {yf, yh, yft, yht};
res2 = SortBy[res,
Position[desiredOrder, #[[1]]][[1, 1]] &];
desiredOrder == First /@ res2
True
Or slightly more compactly
res3 = SortBy[res,
Position[desiredOrder, #[[1]]] &];
desiredOrder == First /@ res3
True
Bob Hanlon
---- kristoph <kristop...@web.de> wrote:
=============