def mini(x, q, qn, d, delta, finac, data, ausf, einf,\ m0, m1, m1c, m2, m2c, typ1_ges, typ2_ges,\ param, nap, step, dt, npts,\ x0, sr0, si0, resid0, residi0): # import ipdb; ipdb.set_trace() xl = np.zeros(nap) xr = np.zeros(nap) xm, qm = move(x, q, nap) for k in range(nap): xl[k] = x[k] - step * d[k] xr[k] = x[k] + step * d[k] #left amp, delay, sub, til, corn_freqs1, corn_freqs2, dmp, nap =\ def_act_sys_par(xl, param, delta, m1c, m2c) sysl, m0_l, m1_l, m2_l = def_sys_par(x0, dt, m0, m1, m2,\ amp, delay, sub, til,\ typ1_ges, typ2_ges,\ corn_freqs1, corn_freqs2, dmp) sr, si, resid, residi =\ freqDamp2paz(sysl, sr0, si0, resid0, residi0,\ m0_l, m1_l, m2_l) sim = ltisim(0, data, ausf, einf, delay, sub, til,\ sr, si, resid, residi, m0_l, m1_l, m2_l, dt, npts) ql = quad(qn, sim, npts) #right amp, delay, sub, til, corn_freqs1, corn_freqs2, dmp, nap =\ def_act_sys_par(xr, param, delta, m1c, m2c) sysr, m0_r, m1_r, m2_r = def_sys_par(x0, dt, m0, m1, m2,\ amp, delay, sub, til,\ typ1_ges, typ2_ges,\ corn_freqs1, corn_freqs2, dmp) sr, si, resid, residi =\ freqDamp2paz(sysr, sr0, si0, resid0, residi0,\ m0_r, m1_r, m2_r) sim = ltisim(0, data, ausf, einf, delay, sub, til,\ sr, si, resid, residi, m0_r, m1_r, m2_r, dt, npts) qr = quad(qn, sim, npts) #maximum? if ql < qm and qr < qm: print 'Maximum encountered! Try again with different start parameters!' sys.exit(1) while ql >= qm and qr >= qm and step >= 8. * finac: step = step / 8. for k in range(nap): xl[k] = xm[k] - step * d[k] xr[k] = xm[k] + step * d[k] #left amp, delay, sub, til, corn_freqs1, corn_freqs2, dmp, nap =\ def_act_sys_par(xl, param, delta, m1c, m2c) sysl, m0_l, m1_l, m2_l = def_sys_par(x0, dt, m0, m1, m2,\ amp, delay, sub, til,\ typ1_ges, typ2_ges,\ corn_freqs1, corn_freqs2, dmp) sr, si, resid, residi =\ freqDamp2paz(sysl, sr0, si0, resid0, residi0,\ m0_l, m1_l, m2_l) sim = ltisim(0, data, ausf, einf, delay, sub, til,\ sr, si, resid, residi, m0_l, m1_l, m2_l, dt, npts) ql = quad(qn, sim, npts) #right amp, delay, sub, til, corn_freqs1, corn_freqs2, dmp, nap =\ def_act_sys_par(xr, param, delta, m1c, m2c) sysr, m0_r, m1_r, m2_r = def_sys_par(x0, dt, m0, m1, m2,\ amp, delay, sub, til,\ typ1_ges, typ2_ges,\ corn_freqs1, corn_freqs2, dmp) sr, si, resid, residi =\ freqDamp2paz(sysr, sr0, si0, resid0, residi0,\ m0_r, m1_r, m2_r) sim = ltisim(0, data, ausf, einf, delay, sub, til,\ sr, si, resid, residi, m0_r, m1_r, m2_r, dt, npts) qr = quad(qn, sim, npts) if ql < qm and qr < qm: print 'Maximum encountered! Try again with different start parameters!' sys.exit(1) #witch side of the minimum? if ql < qm or qr < qm: if ql < qr: #turn around x, q = move(xl, ql, nap) xl, ql = move(xr, qr, nap) xr, qr = move(x, q, nap) for k in range(nap): d[k] = -d[k] if step > 1.: x, q = move(xr, qr, nap) axi = step return x, q, step, axi, amp, delay, sub, til, corn_freqs1, corn_freqs2, dmp else: step = 2. * step xm, qm = move(xr, qr, nap) for k in range(nap): xr[k] = xm[k] + step * d[k] #right amp, delay, sub, til, corn_freqs1, corn_freqs2, dmp, nap =\ def_act_sys_par(xr, param, delta, m1c, m2c) sysr, m0_r, m1_r, m2_r = def_sys_par(x0, dt, m0, m1, m2,\ amp, delay, sub, til,\ typ1_ges, typ2_ges,\ corn_freqs1, corn_freqs2, dmp) sr, si, resid, residi =\ freqDamp2paz(sysr, sr0, si0, resid0, residi0,\ m0_r, m1_r, m2_r) sim = ltisim(0, data, ausf, einf, delay, sub, til,\ sr, si, resid, residi, m0_r, m1_r, m2_r, dt, npts) qr = quad(qn, sim, npts) while qr < qm: if step > 1.: x, q = move(xr, qr, nap) axi = step return x, q, step, axi, amp, delay, sub, til, corn_freqs1, corn_freqs2, dmp else: step = 2. * step xm, qm = move(xr, qr, nap) for k in range(nap): xr[k] = xm[k] + step * d[k] #right amp, delay, sub, til, corn_freqs1, corn_freqs2, dmp, nap =\ def_act_sys_par(xr, param, delta, m1c, m2c) sysr, m0_r, m1_r, m2_r = def_sys_par(x0, dt, m0, m1, m2,\ amp, delay, sub, til,\ typ1_ges, typ2_ges,\ corn_freqs1, corn_freqs2, dmp) sr, si, resid, residi =\ freqDamp2paz(sysr, sr0, si0, resid0, residi0,\ m0_r, m1_r, m2_r) sim = ltisim(0, data, ausf, einf, delay, sub, til,\ sr, si, resid, residi, m0_r, m1_r, m2_r, dt, npts) qr = quad(qn, sim, npts) #interpolate xi = (ql - qr) / (ql -2. * qm + qr) / 2. * step axi = np.abs(xi) for k in range(nap): x[k] = xm[k] + xi * d[k] amp, delay, sub, til, corn_freqs1, corn_freqs2, dmp, nap =\ def_act_sys_par(x, param, delta, m1c, m2c) sysp, m0_i, m1_i, m2_i = def_sys_par(x0, dt, m0, m1, m2,\ amp, delay, sub, til,\ typ1_ges, typ2_ges,\ corn_freqs1, corn_freqs2, dmp) sr, si, resid, residi =\ freqDamp2paz(sysp, sr0, si0, resid0, residi0,\ m0_i, m1_i, m2_i) sim = ltisim(0, data, ausf, einf, delay, sub, til,\ sr, si, resid, residi, m0_i, m1_i, m2_i, dt, npts) q = quad(qn, sim, npts) return x, q, step, axi, amp, delay, sub, til, corn_freqs1, corn_freqs2, dmp if step < 8.*finac: xi = (ql - qr) / (ql -2. * qm + qr) / 2. * step axi = np.abs(xi) for k in range(nap): x[k] = xm[k] + xi * d[k] amp, delay, sub, til, corn_freqs1, corn_freqs2, dmp, nap =\ def_act_sys_par(x, param, delta, m1c, m2c) sysp, m0_i, m1_i, m2_i = def_sys_par(x0, dt, m0, m1, m2,\ amp, delay, sub, til,\ typ1_ges, typ2_ges,\ corn_freqs1, corn_freqs2, dmp) sr, si, resid, residi =\ freqDamp2paz(sysp, sr0, si0, resid0, residi0,\ m0_i, m1_i, m2_i) sim = ltisim(0, data, ausf, einf, delay, sub, til,\ sr, si, resid, residi, m0_i, m1_i, m2_i, dt, npts) q = quad(qn, sim, npts) return x, q, step, axi, amp, delay, sub, til, corn_freqs1, corn_freqs2, dmp print 'Residual error...' print 'Try again with other start parameters!' sys.exit(1)
def mini( x, q, qn, d, delta, finac, data, ausf, einf, m0, m1, m1c, m2, m2c, typ1_ges, typ2_ges, param, nap, step, dt, npts, x0, sr0, si0, resid0, residi0, ): # import ipdb; ipdb.set_trace() xl = np.zeros(nap) xr = np.zeros(nap) xm, qm = move(x, q, nap) for k in range(nap): xl[k] = x[k] - step * d[k] xr[k] = x[k] + step * d[k] # left amp, delay, sub, til, corn_freqs1, corn_freqs2, dmp, nap = def_act_sys_par(xl, param, delta, m1c, m2c) sysl, m0_l, m1_l, m2_l = def_sys_par( x0, dt, m0, m1, m2, amp, delay, sub, til, typ1_ges, typ2_ges, corn_freqs1, corn_freqs2, dmp ) sr, si, resid, residi = freqDamp2paz(sysl, sr0, si0, resid0, residi0, m0_l, m1_l, m2_l) sim = ltisim(0, data, ausf, einf, delay, sub, til, sr, si, resid, residi, m0_l, m1_l, m2_l, dt, npts) ql = quad(qn, sim, npts) # right amp, delay, sub, til, corn_freqs1, corn_freqs2, dmp, nap = def_act_sys_par(xr, param, delta, m1c, m2c) sysr, m0_r, m1_r, m2_r = def_sys_par( x0, dt, m0, m1, m2, amp, delay, sub, til, typ1_ges, typ2_ges, corn_freqs1, corn_freqs2, dmp ) sr, si, resid, residi = freqDamp2paz(sysr, sr0, si0, resid0, residi0, m0_r, m1_r, m2_r) sim = ltisim(0, data, ausf, einf, delay, sub, til, sr, si, resid, residi, m0_r, m1_r, m2_r, dt, npts) qr = quad(qn, sim, npts) # maximum? if ql < qm and qr < qm: print "Maximum encountered! Try again with different start parameters!" sys.exit(1) while ql >= qm and qr >= qm and step >= 8.0 * finac: step = step / 8.0 for k in range(nap): xl[k] = xm[k] - step * d[k] xr[k] = xm[k] + step * d[k] # left amp, delay, sub, til, corn_freqs1, corn_freqs2, dmp, nap = def_act_sys_par(xl, param, delta, m1c, m2c) sysl, m0_l, m1_l, m2_l = def_sys_par( x0, dt, m0, m1, m2, amp, delay, sub, til, typ1_ges, typ2_ges, corn_freqs1, corn_freqs2, dmp ) sr, si, resid, residi = freqDamp2paz(sysl, sr0, si0, resid0, residi0, m0_l, m1_l, m2_l) sim = ltisim(0, data, ausf, einf, delay, sub, til, sr, si, resid, residi, m0_l, m1_l, m2_l, dt, npts) ql = quad(qn, sim, npts) # right amp, delay, sub, til, corn_freqs1, corn_freqs2, dmp, nap = def_act_sys_par(xr, param, delta, m1c, m2c) sysr, m0_r, m1_r, m2_r = def_sys_par( x0, dt, m0, m1, m2, amp, delay, sub, til, typ1_ges, typ2_ges, corn_freqs1, corn_freqs2, dmp ) sr, si, resid, residi = freqDamp2paz(sysr, sr0, si0, resid0, residi0, m0_r, m1_r, m2_r) sim = ltisim(0, data, ausf, einf, delay, sub, til, sr, si, resid, residi, m0_r, m1_r, m2_r, dt, npts) qr = quad(qn, sim, npts) if ql < qm and qr < qm: print "Maximum encountered! Try again with different start parameters!" sys.exit(1) # witch side of the minimum? if ql < qm or qr < qm: if ql < qr: # turn around x, q = move(xl, ql, nap) xl, ql = move(xr, qr, nap) xr, qr = move(x, q, nap) for k in range(nap): d[k] = -d[k] if step > 1.0: x, q = move(xr, qr, nap) axi = step return x, q, step, axi, amp, delay, sub, til, corn_freqs1, corn_freqs2, dmp else: step = 2.0 * step xm, qm = move(xr, qr, nap) for k in range(nap): xr[k] = xm[k] + step * d[k] # right amp, delay, sub, til, corn_freqs1, corn_freqs2, dmp, nap = def_act_sys_par(xr, param, delta, m1c, m2c) sysr, m0_r, m1_r, m2_r = def_sys_par( x0, dt, m0, m1, m2, amp, delay, sub, til, typ1_ges, typ2_ges, corn_freqs1, corn_freqs2, dmp ) sr, si, resid, residi = freqDamp2paz(sysr, sr0, si0, resid0, residi0, m0_r, m1_r, m2_r) sim = ltisim(0, data, ausf, einf, delay, sub, til, sr, si, resid, residi, m0_r, m1_r, m2_r, dt, npts) qr = quad(qn, sim, npts) while qr < qm: if step > 1.0: x, q = move(xr, qr, nap) axi = step return x, q, step, axi, amp, delay, sub, til, corn_freqs1, corn_freqs2, dmp else: step = 2.0 * step xm, qm = move(xr, qr, nap) for k in range(nap): xr[k] = xm[k] + step * d[k] # right amp, delay, sub, til, corn_freqs1, corn_freqs2, dmp, nap = def_act_sys_par(xr, param, delta, m1c, m2c) sysr, m0_r, m1_r, m2_r = def_sys_par( x0, dt, m0, m1, m2, amp, delay, sub, til, typ1_ges, typ2_ges, corn_freqs1, corn_freqs2, dmp ) sr, si, resid, residi = freqDamp2paz(sysr, sr0, si0, resid0, residi0, m0_r, m1_r, m2_r) sim = ltisim(0, data, ausf, einf, delay, sub, til, sr, si, resid, residi, m0_r, m1_r, m2_r, dt, npts) qr = quad(qn, sim, npts) # interpolate xi = (ql - qr) / (ql - 2.0 * qm + qr) / 2.0 * step axi = np.abs(xi) for k in range(nap): x[k] = xm[k] + xi * d[k] amp, delay, sub, til, corn_freqs1, corn_freqs2, dmp, nap = def_act_sys_par(x, param, delta, m1c, m2c) sysp, m0_i, m1_i, m2_i = def_sys_par( x0, dt, m0, m1, m2, amp, delay, sub, til, typ1_ges, typ2_ges, corn_freqs1, corn_freqs2, dmp ) sr, si, resid, residi = freqDamp2paz(sysp, sr0, si0, resid0, residi0, m0_i, m1_i, m2_i) sim = ltisim(0, data, ausf, einf, delay, sub, til, sr, si, resid, residi, m0_i, m1_i, m2_i, dt, npts) q = quad(qn, sim, npts) return x, q, step, axi, amp, delay, sub, til, corn_freqs1, corn_freqs2, dmp if step < 8.0 * finac: xi = (ql - qr) / (ql - 2.0 * qm + qr) / 2.0 * step axi = np.abs(xi) for k in range(nap): x[k] = xm[k] + xi * d[k] amp, delay, sub, til, corn_freqs1, corn_freqs2, dmp, nap = def_act_sys_par(x, param, delta, m1c, m2c) sysp, m0_i, m1_i, m2_i = def_sys_par( x0, dt, m0, m1, m2, amp, delay, sub, til, typ1_ges, typ2_ges, corn_freqs1, corn_freqs2, dmp ) sr, si, resid, residi = freqDamp2paz(sysp, sr0, si0, resid0, residi0, m0_i, m1_i, m2_i) sim = ltisim(0, data, ausf, einf, delay, sub, til, sr, si, resid, residi, m0_i, m1_i, m2_i, dt, npts) q = quad(qn, sim, npts) return x, q, step, axi, amp, delay, sub, til, corn_freqs1, corn_freqs2, dmp print "Residual error..." print "Try again with other start parameters!" sys.exit(1)
def congrad(niter, mp, nap, x, q, qn, finac, delta, data, ausf, einf,\ m0, m1, m1c, m2, m2c, typ1_ges, typ2_ges, gnorm, step, dt, npts,\ param, x0, sr0, si0, resid0, residi0): g = np.zeros(nap) d = np.zeros(nap) dd = np.zeros(nap) #partial derivatives for k in range(nap): x[k] = x[k] + finac amp, delay, sub, til, corn_freqs1, corn_freqs2, dmp, nap =\ def_act_sys_par(x, param, delta, m1c, m2c) #print 'corn_freqs1', corn_freqs1 #print 'corn_freqs2', corn_freqs2 #print 'dmp', dmp syspar_p, m0_p, m1_p, m2_p = def_sys_par(x0, dt, m0, m1, m2,\ amp, delay, sub, til,\ typ1_ges, typ2_ges,\ corn_freqs1, corn_freqs2, dmp) sr, si, resid, residi =\ freqDamp2paz(syspar_p, sr0, si0, resid0, residi0,\ m0_p, m1_p, m2_p) sim = ltisim(0, data, ausf, einf, delay, sub, til,\ sr, si, resid, residi, m0_p, m1_p, m2_p, dt, npts) q_p = quad(qn, sim, npts) x[k] = x[k] - finac - finac amp, delay, sub, til, corn_freqs1, corn_freqs2, dmp, nap =\ def_act_sys_par(x, param, delta, m1c, m2c) syspar_m, m0_m, m1_m, m2_m = def_sys_par(x0, dt, m0, m1, m2,\ amp, delay, sub, til,\ typ1_ges, typ2_ges,\ corn_freqs1, corn_freqs2, dmp) sr, si, resid, residi =\ freqDamp2paz(syspar_m, sr0, si0, resid0, residi0,\ m0_m, m1_m, m2_m) sim = ltisim(0, data, ausf, einf, delay, sub, til,\ sr, si, resid, residi, m0_m, m1_m, m2_m, dt, npts) q_m = quad(qn, sim, npts) x[k] = x[k] + finac g[k] = (q_p - q_m) / 2. / finac #new direction of decent if np.mod(niter, nap) == 0: gnorm = 0. for k in range(nap): gnorm = gnorm + g[k]**2 d[k] = -g[k] else: ga = gnorm gnorm = 0. for k in range(nap): gnorm = gnorm + g[k]**2 beta = gnorm / ga for k in range(nap): d[k] = -g[k] + beta * d[k] dlen = 0. for k in range(nap): dlen = dlen + d[k]**2 dlen = np.sqrt(dlen) for k in range(nap): dd[k] = d[k] / dlen x, q, step, axi, amp, delay, sub, til, corn_freqs1, corn_freqs2, dmp =\ mini(x, q, qn, dd, delta, finac, data, ausf, einf,\ m0, m1, m1c, m2, m2c, typ1_ges, typ2_ges,\ param, nap, step, dt, npts,\ x0, sr0, si0, resid0, residi0) return x, q, d, sim, step, axi, gnorm, \ amp, delay, sub, til, corn_freqs1, corn_freqs2, dmp