コード例 #1
0
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