The optimize Method

The optimize method for the PID model is shown below. The objective function in this case is the weighted sum of R1, R2 and R3, the deviation of displacement, velocity and acceleration; R4 is the inequality constraint, which imposes an upper limit on the gains.
def optimize(self):
    """
    Run an optimization
    """
    obj = [self.R1,self.R2,self.R3]
    wt  = [1,1,1]
    self.opt = Optimizer ( 
            label            = "Optimize RMS2",  
            objective        = obj,              
            weights          = wt,               
            ineqConstraints  = self.R4,       
            plot             = False,
            dsa              = 'FD',
            simFunction      = simulate_function_pid,
            outputMode       = 'FileOnly',
           )

    return self.opt.optimize()

Here we pass in a simulate function instead of specifying end, dtout, type in the optimizer. This deactivates the force during the simulation.

def  simulate_function_pid(model):
     run = model.simulate(end=10, dtout=0.01, returnResults=True, output="Off")
     model.force.active = False
     run = model.simulate(end=100, dtout=0.01, returnResults=True,output="Off")
     model.force.active = True

     return run