title: Optimization in NMPC of second order pendulum model
body: <p>Hopefully, I will be able to explain my question well.</p>
  
  <p>I am working on Nonlinear model predictive control implementation. </p>
  
  <p>I have got 3 files:
  1). a simulink slx file which is basically a nonlinear pendulum model.
  2). A function file, to get the cost function from the simulink model.
  3). MPC code.</p>
  
  <p>code snippet of cost function</p>
  
  <pre><code>**simOut=sim('NonlinearPendulum','StopTime', num2str(Np*Ts));**
  
  %Linearly interpolates X to obtain sampled output states at time instants.
  T=simOut.get('Tsim');
  X=simOut.get('xsim');
  xt=interp1(T,X,linspace(0,Np*Ts,Np+1))';
  
  U=U(1:Nu);
  %Quadratic cost function
  R=0.01;
  J=sum(sum((xt-repmat(r,[1 Np+1])).*(xt-repmat(r,[1 Np+1]))))+R*(U-ur)*...
  (U-ur)';
  </code></pre>
  
  <p>Now I take this cost function and optimize it using fmincon to generate a sequence of inputs to be applied to the model, using my MPC code.
  A code snippet of my MPC code.</p>
  
  <pre><code>%Constraints -1&lt;=u(t)&lt;=1;
  Acons=[eye(Nu,Nu);-eye(Nu,Nu)];
  Bcons=[ones(Nu,1);ones(Nu,1)];
  options = optimoptions(@fmincon,'Algorithm','active-set','MaxIter',100);
  
  warning off
  for a1=1:nf
  
  X=[];                       %Prediction output
  T=[];                       %Prediction time
  
  Xsam=[];
  Tsam=[];
  
  %Nonlinear MPC controller
  Ubreak=linspace(0,(Np-1)*Ts,Np); %Break points for 1D lookup, used to avoid 
  % several calls/compilations of simulink model in fmincon.
  **J=@(v) pendulumCostFunction(v,x0,ur,r(:,a1),Np,Nu,Ts);**
  U=fmincon(J,U0,Acons,Bcons,[],[],[],[],[],options);
  %U=fmincon(J,U0,Acons,Bcons);
  U0=U;
  
  UUsam=[UUsam;U(1)];%Apply only the first selected input
  
  %Apply the selected input to plant.
  Ubreak=[0 Ts]; %Break points for 1D lookup
  U=[UUsam(end) UUsam(end)];
  **simOut=sim('NonlinearPendulum','StopTime', num2str(Ts));**
  </code></pre>
  
  <p>In both the codes, I have marked the times we call our simulink model. Now, issue is that to run this whole simulation for just 5 seconds it takes around 7-8 minutes on my windows machine, MATLAB R2014B.
  Is there a way to optimize this? As, I am planning to extend this algorithm to 9th order system unlike 2nd order pendulum model.</p>
  
  <p>If, anyone has suggestion on using simulink coder to generate C code:
  I have tried that, and the problem I face is that I don't know what to do with the several files generated. Please be as detailed as possible.</p>