2016-10-10 2 views
0

Salut je veux faire la manipulation de l'équation en python: Par exemple, j'ai:manipulation équation en python

"3x^2 + 5xy - 5 = 5x^2 + 2xy" 

L'équation d'entrée peut être quelque chose.

J'ai besoin que le résultat soit:

"-2x^2 + 3xy - 5 = 0" 

Je suis en mesure d'extraire le côté gauche et à droite des équations et les séparer. S'il vous plaît voir le code ci-dessous:

base_equation = raw_input() 
no_spaces_equation = base_equation.replace(" ", "") 
print no_spaces 
left_hand_side = no_spaces[0:no_spaces.index('=')] 
print left_hand_side 
right_hand_side = no_spaces[no_spaces.index('=')+1:len(no_spaces)] 
print right_hand_side 

Cependant, je ne sais pas comment vérifier les variables et leurs signes et les ajouter. Dans l'attente de votre aide.

Merci!

+5

Est-ce un travail à faire, ou avez-vous juste besoin d'analyser des équations? Si ce dernier, il existe des bibliothèques préexistantes pour cela, comme SymPy. – TigerhawkT3

+0

devoirs – ZeusofCode

+1

Voyez-vous, cela va bien au-delà de l'analyse simple des chaînes. L'idée ici serait: vous voulez écrire un ** analyseur ** qui transforme votre entrée en une sorte de représentation AST (arbre de syntaxe abstraite). Et sur cet arbre, vous pouvez commencer à faire toutes sortes d'évaluation, de simplification, et ainsi de suite. S'il s'agit de devoirs "réels", alors cela continuera, et il vous sera demandé d'ajouter exactement une telle fonctionnalité. Alors, Xorgon vous pousse dans la bonne direction, mais préparez-vous à ** beaucoup plus de travail si vous voulez que les choses soient «bonnes»! – GhostCat

Répondre

2

Si vous utilisez des chaînes, cela devrait être relativement simple.

Tenez compte de votre exemple (j'ai mis entre guillemets pour vous assurer qu'il est une chaîne):

"3x^2 + 5xy - 5 = 5x^2 + 2xy" 

, vous veulent clairement qu'il séparer dans les différentes parties, puis les compter. Dans ce cas, x^2, xy et les nombres. Vous pouvez le faire en analysant la chaîne. Pour simplifier la tâche, vous pouvez être restrictif avec la syntaxe, ce qui nécessite un espace entre chaque terme.

Voici un exemple du genre de chose que vous pourriez faire pour regrouper des termes avec une mise en forme de sortie simple:

eqn = "3x^2 + 5xy - 5 = 5x^2 + 2xy" 
split = eqn.split(" ") 

terms = {} 
LHS = True # We start by counting terms on the left hand side of the equation 
for i in split: 
    skip = False 
    term = i 

    if i is "=": # Check if we've moved to the right hand side 
     LHS = False 

    # If the 'term' is actually a symbol and not a term 
    if not term.isalnum() and term.count("^") == 0: 
     continue 

    stripped_digits = 0 # Keep track of the length of the coefficient 

    # Remove the coefficient numbers until we get to the term we're interested in 
    while term[0].isdigit() or term[0] == "-": 
     term = term.lstrip(term[0]) 
     stripped_digits += 1 
     if len(term) == 0: 
      term = "" 
      break 
     # If the 'term' is actually a symbol and not a term 
     if not term.isalnum() and term.count("^") == 0 and term != "": 
      skip = True    
      break 

    if skip: 
     continue 

    # Find the coefficient of the term 
    coeff = int(i[0:stripped_digits]) 

    if split[split.index(i) - 1] == "-": 
     coeff = -coeff 
    if term in terms.keys(): # Check if we've already started counting the term 
     if LHS: 
      terms[term] += coeff 
     else: 
      terms[term] -= coeff 
    else: 
     if LHS: 
      terms[term] = coeff 
     else: 
      terms[term] = -coeff 

print(terms) 
# Now just format the terms as you choose 
output = "" 
for key in terms.keys(): 
    output += str(terms[key]) + key + " + " 
output = output.rstrip("+ ") 
output += " = 0" 
print(output) 

Ce produit les éléments suivants:

{'': -5, 'x^2': -2, 'xy': 3} 
-5 + -2x^2 + 3xy = 0 

De toute évidence, ce n'est pas solution la plus élégante, et je suis sûr que vous trouverez des moyens plus efficaces pour faire la plupart de cela. Mais ce n'est qu'un exemple simple de la façon dont vous pouvez considérer le regroupement des termes.