Full code

In[]:=
​​(*compiledfunctiontocalculateobjectivefunctionvalue*)​​cmpobjfunc[vars_List,objfunc_]:=​​Block[{newvars,newvarsrl},​​​​Quiet[newvars=Table[λ〚i〛,{i,Length[vars]}]];​​newvarsrl=Thread[varsnewvars];​​​​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[varsnewvars];​​];​​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,StepMonitorSow[{cmaxviols[vars],cobj[vars]}]]];​​​​pltvals=Partition[pts〚1〛,2,1];(*partitionpointstogetlinesconnectingpoints*)​​​​(*generateplot*)​​Print[Show[Graphics[Arrow/@pltvals],PlotRangeAll,FrameTrue,AspectRatio1,FrameLabel{"max cons viol","objective value"}]];​​​​{res〚1〛,res〚2〛,"max constraint violation"->pts〚1,-1,1〛}​​]
In[]:=
FindMinimumWithPlot[{x+y,
2
x
+
2
y
1},{{x,1},{y,2}}]
Out[]=
{-1.41421,{x-0.707107,y-0.707107},max constraint violation2.3684×
-9
10
}
In[]:=
FindMinimumWithPlot[{
2
x
-
2
y
,Cos[x-y]>=0.5,-5<=x<=5,-5<=y<=5},{{x,4},{y,-4}}]
Out[]=
{-24.9443,{x0.235988,y-5.},max constraint violation4.13187×
-8
10
}
The default method for this optimization does not support StepMonitor, so the method was set to IPOPT
In[]:=
FindMinimumWithPlotx+y+z,
2
x-
1
2
+
2
y
+
2
z
==1,
2
x+
1
2
+
2
y
+
2
z
==1,{{x,1},{y,-1},{z,1}},Method->"IPOPT"
Out[]=
{-1.22474,{x1.91952×
-17
10
,y-0.612372,z-0.612372},max constraint violation1.42258×
-12
10
}