def main(conc=7e-3, pH=2.0, beta_a=-2.774, beta_b=-2.81): # Fe³⁺ + H₂O = FeOH²⁺ + H⁺ α₁ = log10(β₁) = -2.774 # y 1 z 10**-pH # # 10**-pH * z / y = 10**α₁ (1) # # 2 Fe³⁺ + 2H₂O = Fe₂OH₂⁴⁺ + 2H⁺ α₂ = log10(β₂) = -2.81 # y 1 x 10**-pH # # x*10**-2*pH / y**2 = 10**α₂ (2) # # Total amount of Fe: # conc = [Fe³⁺] + [FeOH²⁺] + 2[Fe₂OH₂⁴⁺] # conc = y + z + 2*x (3) symbs = x, y, z = sympy.symbols('x y z') eq1 = 10**-pH * z / y - 10**beta_a eq2 = x*10**(-2*pH) / y**2 - 10**beta_b eq3 = y + z + 2*x - conc print([eq1, eq2, eq3]) neqsys = SymbolicSys(symbs, [eq1, eq2, eq3]) xout, sol = neqsys.solve([conc/3, conc/3, conc/3]) print(dict(zip('Fe2(OH)2+4 Fe3+ FeOH+2'.split(), xout))) # Simplified treatment: neqsys2 = SymbolicSys([x, y], [eq2, 2*x + y - conc]) xout, sol = neqsys2.solve([conc/2, conc/2]) print(dict(zip('Fe2(OH)2+4 Fe3+'.split(), xout)))
def main(conc=7e-3, pH=2.0, beta_a=-2.774, beta_b=-2.81): # Fe³⁺ + H₂O = FeOH²⁺ + H⁺ α₁ = log10(β₁) = -2.774 # y 1 z 10**-pH # # 10**-pH * z / y = 10**α₁ (1) # # 2 Fe³⁺ + 2H₂O = Fe₂OH₂⁴⁺ + 2H⁺ α₂ = log10(β₂) = -2.81 # y 1 x 10**-pH # # x*10**-2*pH / y**2 = 10**α₂ (2) # # Total amount of Fe: # conc = [Fe³⁺] + [FeOH²⁺] + 2[Fe₂OH₂⁴⁺] # conc = y + z + 2*x (3) symbs = x, y, z = sympy.symbols('x y z') eq1 = 10**-pH * z / y - 10**beta_a eq2 = x * 10**(-2 * pH) / y**2 - 10**beta_b eq3 = y + z + 2 * x - conc print([eq1, eq2, eq3]) neqsys = SymbolicSys(symbs, [eq1, eq2, eq3]) xout, sol = neqsys.solve([conc / 3, conc / 3, conc / 3]) print(dict(zip('Fe2(OH)2+4 Fe3+ FeOH+2'.split(), xout))) # Simplified treatment: neqsys2 = SymbolicSys([x, y], [eq2, 2 * x + y - conc]) xout, sol = neqsys2.solve([conc / 2, conc / 2]) print(dict(zip('Fe2(OH)2+4 Fe3+'.split(), xout)))
def solve(init_a, init_b, power, solver='scipy'): x = sp.symbols('x:2', real=True) p = sp.Symbol('p', real=True, negative=False, integer=True) f = [x[0] + (x[0] - x[1])**p/2 - 1, (x[1] - x[0])**p/2 + x[1]] neqsys = SymbolicSys(x, f, [p]) return neqsys.solve([init_a, init_b], [power], solver=solver)
def main(init_conc='1e-7,1e-7,1e-7,1,55.5', lnKa=-21.28, lnKw=-36.25, savetxt='None', verbose=False, rref=False, charge=False, solver='scipy'): # H+, OH- NH4+, NH3, H2O iHp, iOHm, iNH4p, iNH3, iH2O = init_conc = map(float, init_conc.split(',')) lHp, lOHm, lNH4p, lNH3, lH2O = x = sp.symarray('x', 5) Hp, OHm, NH4p, NH3, H2O = map(sp.exp, x) # lHp + lOHm - lH2O - lnKw, # lHp + lNH3 - lNH4p - lnKa, coeffs = [[1, 1, 0, 0, -1], [1, 0, -1, 1, 0]] vals = [lnKw, lnKa] lp = linear_exprs(coeffs, x, vals, rref=rref) f = lp + [ Hp + OHm + 4 * NH4p + 3 * NH3 + 2 * H2O - (iHp + iOHm + 4 * iNH4p + 3 * iNH3 + 2 * iH2O), # H NH4p + NH3 - (iNH4p + iNH3), # N OHm + H2O - (iOHm + iH2O) ] if charge: f += [Hp - OHm + NH4p - (iHp - iOHm + iNH4p)] neqsys = SymbolicSys(x, f) x, sol = neqsys.solve([0] * 5, solver=solver) if verbose: print(np.exp(x), sol) else: print(np.exp(x)) assert sol.success
def main(init_conc='1e-7,1e-7,1e-7,1,55.5', lnKa=-21.28, lnKw=-36.25, savetxt='None', verbose=False, rref=False, charge=False, solver='scipy'): # H+, OH- NH4+, NH3, H2O iHp, iOHm, iNH4p, iNH3, iH2O = init_conc = map(float, init_conc.split(',')) lHp, lOHm, lNH4p, lNH3, lH2O = x = sp.symarray('x', 5) Hp, OHm, NH4p, NH3, H2O = map(sp.exp, x) # lHp + lOHm - lH2O - lnKw, # lHp + lNH3 - lNH4p - lnKa, coeffs = [[1, 1, 0, 0, -1], [1, 0, -1, 1, 0]] vals = [lnKw, lnKa] lp = linear_exprs(coeffs, x, vals, rref=rref) f = lp + [ Hp + OHm + 4*NH4p + 3*NH3 + 2*H2O - ( iHp + iOHm + 4*iNH4p + 3*iNH3 + 2*iH2O), # H NH4p + NH3 - (iNH4p + iNH3), # N OHm + H2O - (iOHm + iH2O) ] if charge: f += [Hp - OHm + NH4p - (iHp - iOHm + iNH4p)] neqsys = SymbolicSys(x, f) x, sol = neqsys.solve([0]*5, solver=solver) if verbose: print(np.exp(x), sol) else: print(np.exp(x)) assert sol.success
def solve(init_a, init_b, power, solver='scipy'): x = sp.symbols('x:2', real=True) p = sp.Symbol('p', real=True, negative=False, integer=True) f = [x[0] + (x[0] - x[1])**p / 2 - 1, (x[1] - x[0])**p / 2 + x[1]] neqsys = SymbolicSys(x, f, [p]) return neqsys.solve([init_a, init_b], [power], solver=solver)