DMUG-Archiv 2004

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

Re: FindMinimum mit selbstdefinierten Funktionen

Hallo,
ich bin zwar nicht immer der Ansicht von Herrn Kuska in diesem Fall ist aber
die Angabe von Intervallen sicher der richtige Weg. Allerdings gibt es hier
ein paar Punkte zu beachten.
1.) Die Sytanx der Funktion FindMinimum wurde von 4.2 auf 5.x geändert
vorher
FindMinimum[f,{x1,{x1start,x1end}}..] jetzt
FindMinimum[f,{x1,x1start,x1end}..]
2.) Eine Qualitätsfunktion f darf nur einen Wert zurückgeben damit das ganze
Sinn macht
f[x_, y_] := LinearProgramming[{x + y, x - y}, {{}}, {}, {{0, 1}, {2, 3}}];
g[a_, b_] := a + b + f[a + b, a - b];
g[1,3]
{4,6}
Die Funktion g liefert aber 2 Werte zurück.

Ich denke hier liegt sicher ein Fehler begründet.
Mit freundlichen Grüßen,
Stefan Braun


SmartCAE Stefan Braun
Marthastr. 9a
D-81825 München
Tel: 089/43738805
Fax: 089/43738061
Mobil: 0179/5173483
e-mail stefan.braun@XXXXXXX.de
internet: www.smartcae.de





----- Original Message -----
From: "Udo und Susanne Krause" <su.krause@XXXXXXX.ch>
To: "andreas tanner" <tanner@XXXXXXX.de>
Cc: "Deutsche Mathematica News Group" <demug@XXXXXXX.ch>
Sent: Wednesday, March 03, 2004 10:34 PM
Subject: 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.
>
>
>
>



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

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