def J_f_total_v(phiPS_a_v, HP, u, phiPS_ori, f0=0): phiori = phiPS_ori[0] phisori = phiPS_ori[1] phia = phiPS_a_v[0] phisa = phiPS_a_v[1] v = phiPS_a_v[2] phib = (phiori - v * phia) / (1 - v) phisb = (phisori - v * phisa) / (1 - v) #print(phia ,phisa, phib,phisb, v) xeffa = tt.x_eff(HP, phia, phisa, u) fa = tt.f_eng(HP, phia, phisa, u, x=xeffa) dfa, dfsa = tt.df_eng(HP, phia, phisa, u, x=xeffa) xeffb = tt.x_eff(HP, phib, phisb, u) fb = tt.f_eng(HP, phib, phisb, u, x=xeffb) dfb, dfsb = tt.df_eng(HP, phib, phisb, u, x=xeffb) J = np.empty(3) J[0] = v * (dfa - dfb) J[1] = v * (dfsa - dfsb) J[2] = fa - fb + (phib - phia) * dfb + (phisb - phisa) * dfsb return invT * J
def Eng_all(phi_all, u, HP, phis, phi0, f0): phi1 = phi_all[0] phi2 = phi_all[1] v = (phi2 - phi0) / (phi2 - phi1) f1 = tt.f_eng(HP, phi1, phis, u) f2 = tt.f_eng(HP, phi2, phis, u) fall = invT * (v * f1 + (1 - v) * f2 - f0) #print(phi_all, fall) return fall
def f_total_v(phiPS_a_v, HP, u, phiPS_ori, f0): phiori = phiPS_ori[0] phisori = phiPS_ori[1] phia = phiPS_a_v[0] phisa = phiPS_a_v[1] v = phiPS_a_v[2] phib = (phiori - v * phia) / (1 - v) phisb = (phisori - v * phisa) / (1 - v) fa = tt.f_eng(HP, phia, phisa, u) fb = tt.f_eng(HP, phib, phisb, u) #print(phia ,phisa, phib,phisb, v) return invT * (v * fa + (1 - v) * fb - f0)
def J_Eng_all(phi_all, u, HP, phis, phi0, f0): phi1 = phi_all[0] phi2 = phi_all[1] v = (phi2 - phi0) / (phi2 - phi1) xeff1 = tt.x_eff(HP, phi1, phis, u) if tt.useleff else 1 f1 = tt.f_eng(HP, phi1, phis, u, x=xeff1) df1 = tt.df_eng(HP, phi1, phis, u, x=xeff1)[0] xeff2 = tt.x_eff(HP, phi2, phis, u) if tt.useleff else 1 f2 = tt.f_eng(HP, phi2, phis, u, x=xeff2) df2 = tt.df_eng(HP, phi2, phis, u, x=xeff2)[0] J = np.empty(2) J[0] = v * ((f1 - f2) / (phi2 - phi1) + df1) J[1] = (1 - v) * ((f1 - f2) / (phi2 - phi1) + df2) #print(J) return invT * J
def ps_bi_solve( HP, u, phiPS_ori ,r_vini, useJ ): err = phi_min_calc phiori = phiPS_ori[0] phisori = phiPS_ori[1] f0 = tt.f_eng(HP, phiori, phisori, u) phi_ini = [phiori*0.5, phisori*0.95 ] vini = [r_vini*vmin(phi_ini, phiPS_ori)] inis = phi_ini + vini #print(inis) cons_all = ( {'type':'ineq', 'fun': lambda x: x[0]-err }, \ {'type':'ineq', 'fun': lambda x: 1-x[0]-err }, \ {'type':'ineq', 'fun': lambda x: x[1]-err }, \ {'type':'ineq', 'fun': lambda x: 1-x[1]-err }, \ {'type':'ineq', 'fun': lambda x: 1-x[0]-x[1]-err }, \ {'type':'ineq', 'fun': lambda x: x[2]-err }, \ {'type':'ineq', 'fun': lambda x: vmin(x,phiPS_ori)-x[2]-err } \ ) if useJ: result = sco.minimize( f_total_v, inis,\ args = (HP, u, phiPS_ori, f0), \ method = 'SLSQP', \ jac = J_f_total_v, \ constraints = cons_all, \ tol = err/100, \ options={'ftol': err, 'eps': err} ) else: result = sco.minimize( f_total_v, inis,\ args = (HP, u, phiPS_ori, f0), \ method = 'COBYLA', constraints = cons_all, \ tol = err/100 ) #print(result.x) phia = result.x[0] phisa = result.x[1] v = result.x[2] phib = (phiori-v*phia)/(1-v) phisb = (phisori-v*phisa)/(1-v) if phia > phib: t1, t2 = phib, phisb phib, phisb = phia, phisa phia, phisa = t1, t2 v = 1-v return [phia, phisa, phib, phisb, v]
def ps_bi_solve(HP, phis, u, phi_sps, phi_ori=None): err = phi_min_calc phi_max = (1 - 2 * phis) / (1 + HP['pc']) - err sps1, sps2 = phi_sps phi_all_ini = [sps1 * 0.9, sps2 * 1.1] if phi_ori == None: phi_ori = (sps1 + sps2) / 2 f_ori = tt.f_eng(HP, phi_ori, 0, u) result = sco.minimize( Eng_all, phi_all_ini, \ args = (u, HP, phis, phi_ori, f_ori), \ method = 'L-BFGS-B', \ jac = J_Eng_all, \ bounds = ((err,sps1-err), (sps2+err,phi_max)), \ options={'ftol':1e-20, 'gtol':1e-20, 'eps':1e-20} ) bi1 = min(result.x) bi2 = max(result.x) return bi1, bi2