def Eng_all(phi_all, HP, phis, u, phi_ori, f_ori): phi1 = phi_all[0] phi2 = phi_all[1] v = (phi2 - phi_ori) / (phi2 - phi1) f1 = tt.feng(HP, phi1, phis, u) f2 = tt.feng(HP, phi2, phis, u) return invT * (v * f1 + (1 - v) * f2 - f_ori)
def J_Eng_all(phi_all, HP, phis, u, phi_ori, f_ori): phi1 = phi_all[0] phi2 = phi_all[1] v = (phi2 - phi_ori) / (phi2 - phi1) f1 = tt.feng(HP, phi1, phis, u) f2 = tt.feng(HP, phi2, phis, u) df1 = tt.dfeng(HP, phi1, phis, u) df2 = tt.dfeng(HP, phi2, phis, u) J = np.empty(2) J[0] = v * ((f1 - f2) / (phi2 - phi1) + df1) J[1] = (1 - v) * ((f1 - f2) / (phi2 - phi1) + df2) return invT * J
def ps_bi_solve( HP, phis, u, phi_sps, phi_ori=None): err = gv.phi_min_sys phi_max = (1-2*phis*gv.r_sal)/(gv.r_res+gv.r_con*HP['pc'])-err sps1, sps2 = phi_sps phi_all_ini = [ phi_sps[0]*0.9, phi_sps[1]*1.1] if phi_ori == None: phi_ori = (sps1+sps2)/2 fori = tt.feng(HP, phi_ori, phis, u) result = sco.minimize( Eng_all, phi_all_ini, \ args = (HP, phis, u, phi_ori, fori), \ method = 'L-BFGS-B', \ jac = J_Eng_all, \ bounds = ((err,sps1-err), (sps2+err,phi_max-err)), \ options={'ftol':1e-20, 'gtol':1e-20, 'eps':1e-20} ) bi1 = min(result.x) bi2 = max(result.x) return bi1, bi2