2017-07-20 2 views
3

J'ai une mission de l'université où je dois équilibrer l'équation suivante:Comment équilibrer une équation chimique en Python 2.7 Utiliser des matrices

NaOH + H2S04 -> Na2S04 + H20

ma connaissance de python et de codage en général est extrêmement limité pour le moment. Jusqu'à présent, j'ai essayé d'utiliser des matrices pour résoudre l'équation. On dirait que je reçois la solution a = b = x = y = 0 Je suppose que je dois définir une des variables à 1 et résoudre pour les trois autres. Je ne sais pas comment s'y prendre, J'ai fait une recherche, on dirait d'autres personnes ont utilisé du code plus sophistiqué et je ne suis pas vraiment capable de le suivre!

voici ce que j'ai jusqu'à présent

#aNaOH + bH2S04 --> xNa2SO4 +y H20 

    #Na: a=2x 
    #O: a+4b=4x+y 
    #H: a+2h = 2y 
    #S: b = x 

    #a+0b -2x+0y = 0 
    #a+4b-4x-y=0 
    #a+2b+0x-2y=0 
    #0a +b-x+0y=0 

    A=array([[1,0,-2,0], 

      [1,4,-4,-1], 

      [1,2,0,-2], 

      [0,1,-1,0]]) 

    b=array([0,0,0,0]) 




    c =linalg.solve(A,b) 

    print c 

0.0.0.0 
+0

Depuis votre 'b' tableau est un vecteur nul, un résultat évident sera toujours que tous les xs sont nuls . Vous devez effectuer une * réduction de dimension *. –

+0

faire une analyse 'valeur propre '. –

Répondre

1

Le problème est que vous avez construit un système linéaire avec b être un vecteur nul. Maintenant, pour un tel système, il y a toujours la réponse directe que toutes les variables sont également des zéros. Puisque multiplier un nombre par zéro et ajouter des zéros, les résultats sont toujours en zéros. Une solution peut être affecter 1 à une variable. Prenez par exemple a. Si nous attribuons a = 1, alors nous obtenons b, x et y en fonction de a être 1.

Alors maintenant, ou d'un système linéaire:

B X Y | # 
    2 |1 # A = 2X 
-4 4 1 |1 # A+4B = 4X+4Y 
-2  2 |1 # A+2B = 2Y 
-1 1 0 |0 #  B =  X 

Ou mettre en code:

>>> A = array([[0,2,0],[-4,4,1],[-2,0,2],[-1,1,0]]) 
>>> B = array([1,1,1,0]) 
>>> linalg.lstsq(A,B) 
(array([ 0.5, 0.5, 1. ]), 6.9333477997940491e-33, 3, array([ 6.32979642, 2.5028631 , 0.81814033])) 

Cela signifie que:

A = 1, B = 0.5, X = 0.5, Y = 1. 

Si nous multiplier par 2, nous obtenons:

2 NaOH + H2S04 -> Na2S04 + 2 H20 

Ce qui est correct.

+0

Merci pour votre aide, c'était exactement ce que j'essayais de faire. –

+0

@ Lörd Après avoir obtenu deux réponses à votre question, vous voudrez probablement lire [Que faire si quelqu'un répond] (https://stackoverflow.com/help/someone-answers). – ImportanceOfBeingErnest

1

j'ai parlé Solve system of linear integer equations in Python qui traduit en

# Find minimum integer coefficients for a chemical reaction like 
# A * NaOH + B * H2SO4 -> C * Na2SO4 + D * H20 
import sympy 
import re 

# match a single element and optional count, like Na2 
ELEMENT_CLAUSE = re.compile("([A-Z][a-z]?)([0-9]*)") 

def parse_compound(compound): 
    """ 
    Given a chemical compound like Na2SO4, 
    return a dict of element counts like {"Na":2, "S":1, "O":4} 
    """ 
    assert "(" not in compound, "This parser doesn't grok subclauses" 
    return {el: (int(num) if num else 1) for el, num in ELEMENT_CLAUSE.findall(compound)} 

def main(): 
    print("\nPlease enter left-hand list of compounds, separated by spaces:") 
    lhs_strings = input().split() 
    lhs_compounds = [parse_compound(compound) for compound in lhs_strings] 

    print("\nPlease enter right-hand list of compounds, separated by spaces:") 
    rhs_strings = input().split() 
    rhs_compounds = [parse_compound(compound) for compound in rhs_strings] 

    # Get canonical list of elements 
    els = sorted(set().union(*lhs_compounds, *rhs_compounds)) 
    els_index = dict(zip(els, range(len(els)))) 

    # Build matrix to solve 
    w = len(lhs_compounds) + len(rhs_compounds) 
    h = len(els) 
    A = [[0] * w for _ in range(h)] 
    # load with element coefficients 
    for col, compound in enumerate(lhs_compounds): 
     for el, num in compound.items(): 
      row = els_index[el] 
      A[row][col] = num 
    for col, compound in enumerate(rhs_compounds, len(lhs_compounds)): 
     for el, num in compound.items(): 
      row = els_index[el] 
      A[row][col] = -num # invert coefficients for RHS 

    # Solve using Sympy for absolute-precision math 
    A = sympy.Matrix(A)  
    # find first basis vector == primary solution 
    coeffs = A.nullspace()[0]  
    # find least common denominator, multiply through to convert to integer solution 
    coeffs *= sympy.lcm([term.q for term in coeffs]) 

    # Display result 
    lhs = " + ".join(["{} {}".format(coeffs[i], s) for i, s in enumerate(lhs_strings)]) 
    rhs = " + ".join(["{} {}".format(coeffs[i], s) for i, s in enumerate(rhs_strings, len(lhs_strings))]) 
    print("\nBalanced solution:") 
    print("{} -> {}".format(lhs, rhs)) 

if __name__ == "__main__": 
    main() 

qui fonctionne comme

Please enter left-hand list of compounds, separated by spaces: 
NaOH H2SO4 

Please enter right-hand list of compounds, separated by spaces: 
Na2SO4 H2O 

Balanced solution: 
2 NaOH + 1 H2SO4 -> 1 Na2SO4 + 2 H2O