def LorenDiff(ppm, y): baseline = Sim.Spin.Spin(R1=y[-1], R2=0, x0=0.0, c=1.0) water = Sim.Spin.Spin(R1=0, R2=100, x0=0.0, c=1e3) s1 = Sim.Spin.Spin(R1=0, R2=1e4, x0=-3.0, c=1e3) baseline.set_lb_ub('c', None, None) baseline.set_lb_ub('x0', None, None) baseline.set_lb_ub('R1', None, None) baseline.set_lb_ub('R2', None, None) water.set_lb_ub('R2', None, None) water.set_lb_ub('c', None, None) water.set_lb_ub('x0', None, None) s1.set_lb_ub('R2', None, None) s1.set_lb_ub('c', None, None) s1.set_lb_ub('x0', None, None) spins = [baseline, water, s1] x0 = [] for s in spins: for v in s.get_opt_vals(): x0.append(v) opt = optimize.minimize(_calc_RMSD, x0, args=(y, ppm, spins), method='Nelder-Mead', jac=False, options={ 'maxiter': 1e4, 'maxfev': 1e4 }) ls = np.zeros_like(ppm) xxx = np.ndarray.tolist(opt.x) for i, s in enumerate(spins): s.set_opt_vals(xxx) if i == 0: ls += Shapes.logistic_basline(ppm, s) else: ls += Shapes.Guassian(ppm, s) return ls