Guten Abend Andreas,
wenn Sie gemäss Hrn. Kuska Intervalle angeben, geht Ihr FindMinimum
einem schlichten unspektakulaeren Ende entgegen:
In[60]:= FindMinimum[w[{l1, l2, l3, l4, l5}], {l1, {-10., 10}}, {l2,
{-10., 10}}, {l3, {-10., 10.}},
{l4, {-10., 10}}, {l5, {-10., 10}}, MaxIterations -> 170, Compiled ->
False, AccuracyGoal -> 3]
From In[60]:= FindMinimum::fmlim:The minimum could not be bracketed in
170 iterations.
Out[60]= FindMinimum[w[{l1, l2, l3, l4, l5}], {l1, {-10., 10}}, {l2,
{-10., 10}}, {l3, {-10., 10.}},
{l4, {-10., 10}}, {l5, {-10., 10}}, MaxIterations -> 170, Compiled ->
False, AccuracyGoal -> 3]
From In[65]:= FindMinimum::"fmlim":"The minimum could not be bracketed
in 170 iterations."
Gerechnet wurde, heraus kam nichts.
Plot3D[w[{x, y, 10, 0.2, 0.9}], {x, -10, 10}, {y, -10, 10}]
legt den Gedanken nahe, dass Ihr w[l_] in dem Intervall möglicherweise
eine stückweise lineare Funktion der 5 Veränderlichen ist. In dem Fall
ist FindMinimum[] die falsche Funktion, betrachten Sie den Output von
FindMinimum[x + 8, {x, 0}]
FindMinimum[x + 8, {x, {-5, 9}]
FindMinimum[x + 8, {x, 0, -5 , 9}]
keine liefert ein Ergebnis, weil zu einem Minimum das Verschwinden eines
wie immer gearteten Gradienten gehört. Das ist bei einer stückweise
linearen Funktion nicht gegeben, sofern die Funktion nicht konstant ist.
Die richtige Funktion wäre ConstrainedMin[], sie funktioniert auch für
lineare Funktionen, alle Variablen werden als positiv angesehen, der
Definitionsbereich muss mit Ungleichungen angegeben werden . Letzteres
korrespondiert anscheinend dem LinearProgramming Ihrer Liste lw - wenn
es Ihnen gelingt, die Aufgabe zur Benutzung von ConstrainedMin[]
umzuformulieren, dann können Sie damit das Minimum von stückweise
linearen Funktionen finden - das Manual enthält gerade so ein lineares
Beispiel.
Mit den besten Grüssen
Udo.
andreas tanner wrote:
Ok, der gezeigte Code drückte nicht aus, was ich wirklich tun will.
Hier nun das Original:
lw[l_] := LinearProgramming[{-4.32782601300991 + l[[1]]*1 + l[[2]]*1 + \
l[[3]]*0 + l[[4]]*0 + l[[5]]*0, -2.48029145527645 + l[[1]]*0 + l[[
2]]*1 + l[[3]]*1 + l[[4]]*0 + l[[5]]*0, -6.15346408269995 + l[[
1]]*0 + l[[2]]*1 + l[[3]]*1 + l[[4]]*1 + l[[
5]]*0, -3.8197107770572 + l[[1]]*0 + l[[2]]*0 + l[[3]]*1 +
l[[4]]*1 + l[[5]]*1}, {{}}, {}, {{0, 1}, {0, 1}, {0, 1}, {0,
1}}];
w[l_] := Sum[l[[i]], {i, 5}] + Part[lw[l],
1]*(-4.32782601300991 + l[[1]]*1 + l[[2]]*1 + l[[3]]*0 +
l[[4]]*0 +
l[[5]]*0) + Part[lw[l], 2]*(-2.48029145527645 + l[[1]]*0 +
l[[2]]*1 + l[[3]]*1 +
l[[4]]*0 + l[[5]]*0) + Part[lw[l], 3]*(-6.15346408269995 + l[[
1]]*0 + l[[2]]*1 + l[[3]]*1 + l[[4]]*1 + l[[5]]*0) + Part[lw[l],
4]*(-3.8197107770572 + l[[1]]*0 + l[[2]]*0 + l[[3]]*1 +
l[[4]]*1 + l[[5]]*1);
w liefert also einen skalaren Wert.
Wie kann ich nun Minima von w suchen? (Der Code ist natürlich
generiert, die reellen Koeffizienten variieren).
Eigentlich würde ich erwarten, dass
FindMinimum[w[{l1, l2, l3, l4, l5}], {l1, 0}, {l2, 0}, {l3, 0}, {l4,
0}, {l5, 0}]
korrekt ist, schließlich bietet die Dokumentation als Beispiel
FindMinimum[x\^4 + 3 \( x\^2\) y + 5 y\^2 + x + y, {x, 0.1}, {y,0.2}]
Hier ist die zu minimierende Funktion inline definiert, bei mir
extern, was anscheinend micht erlaubt ist.