Einführung in Mathematica XVc

Minimumssuche mit Newton

© Jürgen Schnack, 2016/06/02

Problem

Suchen das Minimum einer Funktion in einem hochdimensionalen Raum. 

Benutzen Informationen über die zweiten Ableitungen, um besser der Krümmung zum Minimum zu folgen: Newton-Verfahren.

Funktion

f[x_,y_]=-10.0*(x^2+y^2)+0.1*(x^2+y^2)^2-10*(x+y);
CP0=ContourPlot[f[x,y],{x,-10,10},{y,-10,10}]

Minimumsfunktion von Mathematica

FindMinimum[f[x,y],{x,y}]

KP0=ListPlot[{{5.233402659035999`,5.233402659035999`}},PlotStyle->{Hue[0.8],PointSize[0.02]},
PlotRange->{{-1.0,10.0},{-1.0,10.0}}];

Mal sehen, ob wir da auch hinkommen!

Gradientenverfahren I

grad1[x_,y_]=Grad[f[x,y],{x,y}];

grad1[x,y]

x0=7.0;y0=0.0;  (* Startwerte *)
Delta=0.02;(* Schrittweite *)
KoordinatenPfad=Table[{x0,y0},{n,1,1}];
Length0=Length[KoordinatenPfad];
For[i=0,i<20,i++,
xneu=x0-Delta*grad1[x,y][[1]]/.{x->x0,y->y0};
yneu=y0-Delta*grad1[x,y][[2]]/.{x->x0,y->y0};
x0=xneu;y0=yneu;
AppendTo[KoordinatenPfad,{x0,y0}]];

(*Print[TableForm[KoordinatenPfad]]*)

Gradientenverfahren I - Pfad im Raum

KP1=ListPlot[KoordinatenPfad,PlotStyle->{Hue[0.0],PointSize[0.015]},
PlotRange->{{-1.0,10.0},{-1.0,10.0}}];
CP1=ContourPlot[f[x,y],{x,0,10},{y,0,10}];
Show[CP1,KP1,KP0]

Gradientenverfahren II nach Newton mit inverser Hesse-Matrix

grad2[x_,y_]=Grad[grad1[x,y],{x,y}];

grad2[x,y][[1,2]]

x0=7.0;y0=0.0;  (* Startwerte *)
Delta=0.02;(* Schrittweite *)
KoordinatenPfad2=Table[{x0,y0},{n,1,1}];
Length0=Length[KoordinatenPfad2];
For[i=0,i<20,i++,
G=(({{grad2[x,y][[1,1]]/.{x->x0,y->y0}, grad2[x,y][[1,2]]/.{x->x0,y->y0}}, {grad2[x,y][[2,1]]/.{x->x0,y->y0}, grad2[x,y][[2,2]]/.{x->x0,y->y0}}}));
GI=Inverse[G];(*Print[G," , ",GI," , ",GI[[1,1]]];*)
grx=grad1[x,y][[1]]/.{x->x0,y->y0};
gry=grad1[x,y][[2]]/.{x->x0,y->y0};
xneu=x0-GI[[1,1]]*grx-GI[[1,2]]*gry;
yneu=y0-GI[[2,2]]*gry-GI[[2,1]]*grx;
x0=xneu;y0=yneu;
AppendTo[KoordinatenPfad2,{x0,y0}]];

(*Print[TableForm[KoordinatenPfad]]*)

Gradientenverfahren II - Pfad im Raum

KP2=ListPlot[KoordinatenPfad2,PlotStyle->{Hue[0.3],PointSize[0.015]},
PlotRange->{{-1.0,10.0},{-1.0,10.0}}];
Show[CP1,KP1,KP2,KP0]

Schlussfolgerung

Der Pfad des Newton-Verfahrens ist nicht ganz einleuchtend, aber es werden definitiv weniger Schritte gebraucht.

Auch hier könnte man noch einen Faktor vorschalten.