DMUG-Archiv 2004

Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

Re: FindMinimum mit selbstdefinierten Funktionen

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.



Antworten:
Verweise:
Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

DMUG DMUG-Archiv, http://www.mathematica.ch/archiv.html