Full code
Full code
In[]:=
(*compiledfunctiontocalculateobjectivefunctionvalue*)cmpobjfunc[vars_List,objfunc_]:=Block[{newvars,newvarsrl},Quiet[newvars=Table[λ〚i〛,{i,Length[vars]}]];newvarsrl=Thread[varsnewvars];Compile[{{λ,_Real,1}},Evaluate[objfunc/.newvarsrl],RuntimeAttributes{Listable}]]
In[]:=
(*ruletocalculateconstraintviolationsfromconstraints*)violrl={Equal[x_,y_]Abs[x-y],LessEqual[x_,y_]Max[x-y,0],GreaterEqual[x_,y_]Max[y-x,0],LessEqual[lb_,x_,ub_]Max[0,lb-x,x-ub]};
In[]:=
(*compiledfunctiontocalculatemaximumconstraintviolation*)cmpmaxviol[vars_List,cons_List]:=Block[{consviolv,newvars,newvarsrl,newconsviol,maxconsviol},If[Length[cons]>0,consviol=cons/.violrl;Quiet[newvars=Table[λ〚i〛,{i,Length[vars]}];newvarsrl=Thread[varsnewvars];];newconsviol=consviol/.newvarsrl;maxconsviol=Max[newconsviol];Compile[{{λ,_Real,1}},Evaluate[maxconsviol],RuntimeAttributes{Listable}],Compile[{{λ,_Real,1}},0]]]
FindMinimumWithPlot[objandcons_List,varswithstarts_List,opts___]:=Block[{obj,cons,vars,cobj,cmaxviols,res,pts,objvals,consvals,pltvals,pltvals1,arrs},obj=objandcons〚1〛;(*objectivefunction*)cons=Drop[objandcons,1];(*constraints*)vars=varswithstarts〚All,1〛;(*variables*)cobj=cmpobjfunc[vars,obj];(*compiledobjectivefunction*)cmaxviols=cmpmaxviol[vars,cons];(*compiledmaximumconstraintviolation*)(*calculateFindMinimumresultandintermediatevaluesforobjectivefunctionvalueandmaxconstraintviolationvalue*){res,pts}=Reap[FindMinimum[objandcons,varswithstarts,opts,StepMonitorSow[{cmaxviols[vars],cobj[vars]}]]];pltvals=Partition[pts〚1〛,2,1];(*partitionpointstogetlinesconnectingpoints*)(*generateplot*)Print[Show[Graphics[Arrow/@pltvals],PlotRangeAll,FrameTrue,AspectRatio1,FrameLabel{"max cons viol","objective value"}]];{res〚1〛,res〚2〛,"max constraint violation"->pts〚1,-1,1〛}]
In[]:=
FindMinimumWithPlot[{x+y,+1},{{x,1},{y,2}}]
2
x
2
y
Out[]=
{-1.41421,{x-0.707107,y-0.707107},max constraint violation2.3684×}
-9
10
In[]:=
FindMinimumWithPlot[{-,Cos[x-y]>=0.5,-5<=x<=5,-5<=y<=5},{{x,4},{y,-4}}]
2
x
2
y
Out[]=
{-24.9443,{x0.235988,y-5.},max constraint violation4.13187×}
-8
10
The default method for this optimization does not support StepMonitor, so the method was set to IPOPT
In[]:=
FindMinimumWithPlotx+y+z,++==1,++==1,{{x,1},{y,-1},{z,1}},Method->"IPOPT"
2
x-
1
2
2
y
2
z
2
x+
1
2
2
y
2
z
Out[]=
{-1.22474,{x1.91952×,y-0.612372,z-0.612372},max constraint violation1.42258×}
-17
10
-12
10