예제 #1
0
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)))
예제 #2
0
파일: ammonia.py 프로젝트: andim/pyneqsys
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
예제 #3
0
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)