Пример #1
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)
Пример #2
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)))
Пример #3
0
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
Пример #4
0
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
Пример #5
0
    def _SymbolicSys_from_NumSys(
        self, NS, conds, rref_equil, rref_preserv, new_eq_params=True
    ):
        from pyneqsys.symbolic import SymbolicSys
        import sympy as sp

        ns = NS(
            self,
            backend=sp,
            rref_equil=rref_equil,
            rref_preserv=rref_preserv,
            precipitates=conds,
            new_eq_params=new_eq_params,
        )
        symb_kw = {}
        if ns.pre_processor is not None:
            symb_kw["pre_processors"] = [ns.pre_processor]
        if ns.post_processor is not None:
            symb_kw["post_processors"] = [ns.post_processor]
        if ns.internal_x0_cb is not None:
            symb_kw["internal_x0_cb"] = ns.internal_x0_cb
        return SymbolicSys.from_callback(
            ns.f,
            self.ns,
            nparams=self.ns + (self.nr if new_eq_params else 0),
            **symb_kw
        )
Пример #6
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)))
Пример #7
0
 def _SymbolicSys_from_NumSys(self, NS, conds, rref_equil, rref_preserv):
     from pyneqsys.symbolic import SymbolicSys
     import sympy as sp
     ns = NS(self, backend=sp, rref_equil=rref_equil,
             rref_preserv=rref_preserv, precipitates=conds)
     symb_kw = {}
     if ns.pre_processor is not None:
         symb_kw['pre_processors'] = [ns.pre_processor]
     if ns.post_processor is not None:
         symb_kw['post_processors'] = [ns.post_processor]
     if ns.internal_x0_cb is not None:
         symb_kw['internal_x0_cb'] = ns.internal_x0_cb
     return SymbolicSys.from_callback(
         ns.f, self.ns, nparams=self.ns + self.nr, **symb_kw)
Пример #8
0
 def _SymbolicSys_from_NumSys(self, NS, conds, rref_equil, rref_preserv):
     from pyneqsys.symbolic import SymbolicSys
     import sympy as sp
     ns = NS(self, backend=sp, rref_equil=rref_equil,
             rref_preserv=rref_preserv, precipitates=conds)
     symb_kw = {}
     if ns.pre_processor is not None:
         symb_kw['pre_processors'] = [ns.pre_processor]
     if ns.post_processor is not None:
         symb_kw['post_processors'] = [ns.post_processor]
     if ns.internal_x0_cb is not None:
         symb_kw['internal_x0_cb'] = ns.internal_x0_cb
     return SymbolicSys.from_callback(
         ns.f, self.ns, nparams=self.ns + self.nr, **symb_kw)
Пример #9
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)