A = 10;
a2 = 2.0;
h2 = 1.0;
b2 = 2.0;
d2 = 1850;
L2 = 0.05;
σ2 = 500;
c2 = Which[0 < d2*T <= 50, 7.5, 50 < d2*T <= 200, 5.5,200 < d2*T <= 400,0.5, 400 < d2*T <= 500, 2.5, 500 < d2*T, 1,True, 1];

NMinimize[{A/T + d2*T*c2 +h2*((d2*T)/2 + k*σ2*√(T + L2))
+ b2/T*σ2*√(T + L2)*(PDF[NormalDistribution[0, 1], k]
- k*(1 - CDF[NormalDistribution[0, 1], k])), 0 <= T <= 3, 0 <= k <= 4},
{T, k},
Method -> "DifferentialEvolution"]

(* {1023.18, {T -> 0.0292988, k -> 2.17944}} *)

NMinimize[{A/T + d2*T*c2 + h2*((d2*T)/2 + k*σ2*√(T + L2))
+ b2/T*σ2*√(T + L2)*(PDF[NormalDistribution[0, 1], k]
- k*(1 - CDF[NormalDistribution[0, 1], k])), 0 <= T <= 3, 0 <= k <= 4},
{T, k}]

(* {1241.94, {T -> 0.27027, k -> 1.10251}} *)


I've always known NMinimize to find optimal values. However, in this case, NMinimize found a non-optimal answer, so I drew a plot instead.

How can I handle this? Do I have to use Method - > "DifferentialEvolution"?

• Perhaps have a read of the this tutorial reference.wolfram.com/language/tutorial/… Jul 30, 2015 at 6:55
• Also to quote this answer "A principle in successfully optimizing functions is to make them as smooth and convex as possible." Jul 30, 2015 at 7:07
• It is well worth checking what is the default method NMinimize chooses. If not differential evolution, it is probably Nelder-Mead, which is not a good global optimizer (it is a direct search method, but it is really still limited to local minimization). Differential evolution, as you see, is quite powerful (at the expense of many function evaluations); probably the most powerful of all methods offered. But all of the methods provided by NMinimize are just heuristics; you have no guarantee of finding the true global minimum in general. Jul 30, 2015 at 12:57

I get good result with v10.2 0n my Mac

\$Version


"10.2.0 for Mac OS X x86 (64-bit) (July 7, 2015)"

A = 10;
a2 = 2;
h2 = 1;
b2 = 2;
d2 = 1850;
L2 = 5/100;
\[Sigma]2 = 500;
c2 = Which[0 < d2*T <= 50, 15/2, 50 < d2*T <= 200, 11/2, 200 < d2*T <= 400,
1/2, 400 < d2*T <= 500, 5/2, 500 < d2*T, 1, True, 1];

f[k_, T_] =
A/T + d2*T*c2 + h2*((d2*T)/2 + k*\[Sigma]2*\[Sqrt](T + L2)) +
b2/T*\[Sigma]2*\[Sqrt](T + L2)*(PDF[NormalDistribution[0, 1], k] -
k*(1 - CDF[NormalDistribution[0, 1], k]));


It seems unusual to me that the function mixes a PDF with a CDF.

sol = NMinimize[{f[k, T], 0 <= T <= 3, 0 <= k <= 4}, {T, k},
Method -> #] & /@
{"DifferentialEvolution", Automatic}


{{696.079, {T -> 0.108108, k -> 1.60671}}, {711.419, {T -> 0.108108,
k -> 1.90547}}}

sol = MinimalBy[sol, First][[1, -1]];

Show[
Plot3D[f[k, T], {T, 0, 0.5}, {k, 0, 4},
ClippingStyle -> None,
PlotPoints -> {201, 50},
PlotStyle -> Opacity[.8]],
Graphics3D[{
Red, AbsolutePointSize[6],
Point[{T, k, f[k, T]} /. sol]}]]