# Function optimization errors

I have the following Mathematica code (Mathematica version 9):

DH[x_] := (0.399582 Exp[-0.501606 (-3.57699 + Log[x])^2])/x
F[n1_, n2_] := Integrate[DH[x], {x, n1, n2}];
G[n_] := Integrate[DH[x], {x, 0, n - 1}];
Cp[n1_, n2_] := Piecewise[{{F[n1, n2]*Log2[n1], n1 < n2},
{0, n1 >= n2}}];
Et[n1_, n2_] := Piecewise[{{-F[n1, n2]*Log2[F[n1, n2]], n1 < n2 },
{0, n1 >= n2}}];
H[n1_, n2_] := Piecewise[{{Cp[n1, n2] + Cp[n2, 233]- Et[n1, n2]-Et[n2, 233]-G[n1], n1 < n2},
{0, n1 >= n2}}];


I want to maximize value of H[n1,n2] and I use the Maximize function:

Maximize[{H[n1, n2],2<=n1<=231 && 3<=n2<=232 && n1 < n2}, {n1, n2}, Reals]


After I run the program, I obtained the solution: {2.64505, {n1 -> 11.6199, n2 -> 232.}}

and many error messages. How obtain the maximum?

• a general comment: try to avoid capitalized function names, especially if single letter (I see no conflicts in your case above (as you go for DH, Cp, Et in the critical cases), but you risk conflicting with built-in symbols, such as D, C etc.) Aug 23, 2013 at 6:59
• Your code contains a syntax error (bracket mismatch) in the DH definition. Please ensure your code runs properly as copied and pasted from the site. As DH is using reals, you might as well switch over to NMaximize directly (Maximize does it for you already). Aug 23, 2013 at 7:49
• I modified the message.Thanks for the observations. Aug 23, 2013 at 8:23

I would suggest defining F and G using Set instead of SetDelayed, so that the integral is done just once:

F[n1_, n2_] = Integrate[DH[x], {x, n1, n2}, Assumptions -> {n1 > 0, n2 > 0}];
G[n_] = Integrate[DH[x], {x, 0, n - 1}];


For the maximization , you could try changing the Method option if the default is giving bad results. For example:

NMaximize[{H[n1, n2], 2 <= n1 <= 231 && 3 <= n2 <= 232 && n1 < n2}, {n1, n2},
Method -> "DifferentialEvolution"]
(* {2.73157, {n1 -> 6.92863, n2 -> 18.3921}} *)


There is a tutorial on Numerical Nonlinear Global Optimization, with details about the various method options.