Integrate inside an NMinimize?

Hi everyone,

I am trying to solve this minimization function that includes an integral.

NMinimize[{(Integrate[
    1 - (E^(-c*Subscript[k, 1]/w *r))^Subscript[a, 
      1]*(E^(-c*Subscript[k, 2]/w *r))^Subscript[a, 
      2]*(E^(-c*Subscript[k, 3]/w *r))^Subscript[a, 
      3]*(E^(-c*Subscript[k, 4]/w *r))^Subscript[a, 4], {r, Subscript[
     r, q], Subscript[r, q2]}]), {Subscript[r, q] == 475, 
   Subscript[r, q2] == 1200, w == 3140, m == 100, 
   Subscript[k, 1] == 34, Subscript[k, 2] == 27, 
   Subscript[k, 3] == 20, Subscript[k, 4] == 14, c == 0.79788456, 
   Subscript[a, 1] >= 0, Subscript[a, 2] >= 0, Subscript[a, 3] >= 0, 
   Subscript[a, 4] >= 0, 
   Subscript[a, 1] + Subscript[a, 2] + Subscript[a, 3] + Subscript[a, 
     4] == m, Integers}}, {Subscript[a, 1], Subscript[a, 2], 
  Subscript[a, 3], Subscript[a, 4], Subscript[k, 1], Subscript[k, 2], 
  Subscript[k, 3], Subscript[k, 4], m, Subscript[r, q], Subscript[r, 
  q2], w}]

I am getting an error saying the following constraints are not valid (and copies the entire constraints list inside it). Is it because Integrate is not supposed to work inside NMinimize? Or is it because I am doing a dumb syntactical mistake? Thanks for your help!

When you aren’t certain whether the integration can work inside NMinimize and your integral is simple enough then just pull the integration outside the NMinimize.

In[1]:= int = 
 Integrate[
   1 - (E^(-c*Subscript[k, 1]/w*r))^Subscript[a, 1]* (E^(-c*Subscript[k, 2]/w*r))^Subscript[a, 2]*
     (E^(-c*Subscript[k, 3]/w*r))^Subscript[a, 3]* (E^(-c*Subscript[k, 4]/w*r))^Subscript[a, 4],
     {r, Subscript[r, q], Subscript[r, q2]}] /.
     {w->3140, Subscript[k,1]->34, Subscript[k,2]->27, Subscript[k,3]->20,
      Subscript[k,4]->14, c->0.79788456, Subscript[r,q]->475, Subscript[r,q2]->1200}

Out[1]= 725 - (3935.41 (-0.0000314404^Subscript[a,1] 0.000265751^Subscript[a,2]
     0.00224628^Subscript[a,3] 0.0139967^Subscript[a,4] + 0.0165103^Subscript[a,1]
     0.0384316^Subscript[a,2]0.0894584^Subscript[a,3] 0.184559^Subscript[a,4]))/
    (34 Subscript[a,1] + 27 Subscript[a,2] + 20 Subscript[a,3] + 14 Subscript[a,4])

Next, I don’t see in the documentation that you can simply declare ‘Integers’, as you can do in a few other functions. I do see that you can declare that particular variables are in the domain of Integers. I will skip that for the moment and look at the minimization

In[2]:= NMinimize[{int, {Subscript[a,1]>=0, Subscript[a,2]>=0, Subscript[a,3]>=0, Subscript[a,4]>=0, 
   Subscript[a,1]+Subscript[a,2]+Subscript[a,3]+Subscript[a,4]==100}},
   {Subscript[a,1], Subscript[a,2], Subscript[a,3], Subscript[a,4]}]

During evaluation of In[2]:= NMinimize::cvmit: Failed to converge to the requested accuracy or precision within 100 iterations. >>

Out[2]= {725., {Subscript[a,1]->90.2067, Subscript[a,2]->4.37246, Subscript[a,3]->2.76843, Subscript[a,4]->2.65242}}

The warning about convergence might not be serious. This is likely because of the precision of the parameters that you have used.

This is not a complete solution to your problem, but perhaps you can adapt this to get where you need to go.