2017-01-04 19 views
2

Ich versuche, einen längeren Ausdruck von Mathematica in Python zu importieren. Ich kopierte die FortranForm des Mathematica-Ausdrucks in Python und setzte alle Zeilen so, dass sie den gleichen Einzug haben. Aber ich bekomme einen Fehler, den ich nicht verstehe. Ich vermute, dass dies ein Problem mit der Einrückung ist, aber ich bin mir nicht sicher. Bitte helfen Sie.Mathematica-Ausdruck korrekt in Python importieren

Dies ist der Code in Python, mit Vertiefung:

def f2(x,y,z,x1,y1,z1,x2,y2,z2,x3,y3,z3): 
    return ((x2*(y - y1) + x*(y1 - y2) + x1*(-y + y2))*(y2 - y3) + (-y1 + y2)*(x3*(-y + y2) + x2*(y - y3) + x*(-y2 + y3)) + 
    (x2*(z - z1) + x*(z1 - z2) + x1*(-z + z2))*(z2 - z3) + (-z1 + z2)*(x3*(-z + z2) + x2*(z - z3) + x*(-z2 + z3)))/ 
    (np.sqrt((x - x1)**2 + (y - y1)**2 + (z - z1)**2)*((x - x2)**2 + (y - y2)**2 + (z - z2)**2)*np.sqrt((x - x3)**2 + (y - y3)**2 + (z - z3)**2)) - 
    ((x - x3)*((x2*(-y + y1) + x1*(y - y2) + x*(-y1 + y2))*(x3*(-y + y2) + x2*(y - y3) + x*(-y2 + y3)) + 
    (x2*(-z + z1) + x1*(z - z2) + x*(-z1 + z2))*(x3*(-z + z2) + x2*(z - z3) + x*(-z2 + z3)) + 
    (y2*(-z + z1) + y1*(z - z2) + y*(-z1 + z2))*(y3*(-z + z2) + y2*(z - z3) + y*(-z2 + z3))))/ 
    (np.sqrt((x - x1)**2 + (y - y1)**2 + (z - z1)**2)*((x - x2)**2 + (y - y2)**2 + (z - z2)**2)*((x - x3)**2 + (y - y3)**2 + (z - z3)**2)**1.5) - 
    (2*(x - x2)*((x2*(-y + y1) + x1*(y - y2) + x*(-y1 + y2))*(x3*(-y + y2) + x2*(y - y3) + x*(-y2 + y3)) + 
    (x2*(-z + z1) + x1*(z - z2) + x*(-z1 + z2))*(x3*(-z + z2) + x2*(z - z3) + x*(-z2 + z3)) + 
    (y2*(-z + z1) + y1*(z - z2) + y*(-z1 + z2))*(y3*(-z + z2) + y2*(z - z3) + y*(-z2 + z3))))/ 
    (np.sqrt((x - x1)**2 + (y - y1)**2 + (z - z1)**2)*((x - x2)**2 + (y - y2)**2 + (z - z2)**2)**2*np.sqrt((x - x3)**2 + (y - y3)**2 + (z - z3)**2)) - 
    ((x - x1)*((x2*(-y + y1) + x1*(y - y2) + x*(-y1 + y2))*(x3*(-y + y2) + x2*(y - y3) + x*(-y2 + y3)) + 
    (x2*(-z + z1) + x1*(z - z2) + x*(-z1 + z2))*(x3*(-z + z2) + x2*(z - z3) + x*(-z2 + z3)) + 
    (y2*(-z + z1) + y1*(z - z2) + y*(-z1 + z2))*(y3*(-z + z2) + y2*(z - z3) + y*(-z2 + z3))))/ 
    (((x - x1)**2 + (y - y1)**2 + (z - z1)**2)**1.5*((x - x2)**2 + (y - y2)**2 + (z - z2)**2)*np.sqrt((x - x3)**2 + (y - y3)**2 + (z - z3)**2)) 

Dies ist der Fehler, die ich bekomme:

File "<ipython-input-87-f30bebfee3b2>", line 4 
x2*(z - z1) + x*(z1 - z2) + x1*(-z + z2))*(z2 - z3) + (-z1 + z2)*(x3*(-z + z2) + x2*(z - z3) + x*(-z2 + z3)))/ 
SyntaxError: invalid syntax 
+0

Was ist das? Irgendeine Art von Erweiterung? Hast du überprüft, ob es von 'numpy' /' scipy' unterstützt wird? – roganjosh

+0

Der Code ist ziemlich hässlich. Versuchen Sie es zu bearbeiten, indem Sie [PEP 8] (https://www.python.org/dev/peps/pep-0008/#maximum-line-length) betrachten – Lucas

Antwort

4

Die ungültige Syntax der Zeilenumbruch im Ausdruck ist. Zum Beispiel

ist ungültig. Eine einfache Lösung ist es, den Ausdruck in Klammern zu wickeln:

def valid_break(): 
    return (1/
      2) 

zum Beispiel Siehe How can I do a line break (line continuation) in Python? kristallklar sein, ein Lösen des Problems ist lange Ausdruck in Klammern wickeln, das heißt

def f2(x,y,z,x1,y1,z1,x2,y2,z2,x3,y3,z3): 
     return (((x2*(y - y1) + x*(y1 - y2) + x1*(-y + y2))*(y2 - y3) + (-y1 + y2)*(x3*(-y + y2) + x2*(y - y3) + x*(-y2 + y3)) + 
     (x2*(z - z1) + x*(z1 - z2) + x1*(-z + z2))*(z2 - z3) + (-z1 + z2)*(x3*(-z + z2) + x2*(z - z3) + x*(-z2 + z3)))/ 
     (np.sqrt((x - x1)**2 + (y - y1)**2 + (z - z1)**2)*((x - x2)**2 + (y - y2)**2 + (z - z2)**2)*np.sqrt((x - x3)**2 + (y - y3)**2 + (z - z3)**2)) - 
     ((x - x3)*((x2*(-y + y1) + x1*(y - y2) + x*(-y1 + y2))*(x3*(-y + y2) + x2*(y - y3) + x*(-y2 + y3)) + 
     (x2*(-z + z1) + x1*(z - z2) + x*(-z1 + z2))*(x3*(-z + z2) + x2*(z - z3) + x*(-z2 + z3)) + 
     (y2*(-z + z1) + y1*(z - z2) + y*(-z1 + z2))*(y3*(-z + z2) + y2*(z - z3) + y*(-z2 + z3))))/ 
     (np.sqrt((x - x1)**2 + (y - y1)**2 + (z - z1)**2)*((x - x2)**2 + (y - y2)**2 + (z - z2)**2)*((x - x3)**2 + (y - y3)**2 + (z - z3)**2)**1.5) - 
     (2*(x - x2)*((x2*(-y + y1) + x1*(y - y2) + x*(-y1 + y2))*(x3*(-y + y2) + x2*(y - y3) + x*(-y2 + y3)) + 
     (x2*(-z + z1) + x1*(z - z2) + x*(-z1 + z2))*(x3*(-z + z2) + x2*(z - z3) + x*(-z2 + z3)) + 
     (y2*(-z + z1) + y1*(z - z2) + y*(-z1 + z2))*(y3*(-z + z2) + y2*(z - z3) + y*(-z2 + z3))))/ 
     (np.sqrt((x - x1)**2 + (y - y1)**2 + (z - z1)**2)*((x - x2)**2 + (y - y2)**2 + (z - z2)**2)**2*np.sqrt((x - x3)**2 + (y - y3)**2 + (z - z3)**2)) - 
     ((x - x1)*((x2*(-y + y1) + x1*(y - y2) + x*(-y1 + y2))*(x3*(-y + y2) + x2*(y - y3) + x*(-y2 + y3)) + 
     (x2*(-z + z1) + x1*(z - z2) + x*(-z1 + z2))*(x3*(-z + z2) + x2*(z - z3) + x*(-z2 + z3)) + 
     (y2*(-z + z1) + y1*(z - z2) + y*(-z1 + z2))*(y3*(-z + z2) + y2*(z - z3) + y*(-z2 + z3))))/ 
     (((x - x1)**2 + (y - y1)**2 + (z - z1)**2)**1.5*((x - x2)**2 + (y - y2)**2 + (z - z2)**2)*np.sqrt((x - x3)**2 + (y - y3)**2 + (z - z3)**2))) 
+1

@roganjosh Ich weiß, dass '/' ist Division und '\ \ "" ist explizite Zeilenfortsetzung. Der Syntaxfehler ist ein ungültiger Zeilenumbruch im OP-Code, der zufällig nach einer Division auftritt. '/' – innisfree

+0

@innisfree Also, sagen Sie, dass es nach dem '/' Divisionszeichen einen impliziten ungültigen Zeilenumbruch gibt? Wie repariere ich das? Durch Hinzufügen von Klammern um '/' bei jedem Zeilenumbruch - '(/)'? Oder gibt es eine einfachere Lösung? – ap21

+0

@roganjosh ja, könnten Sie – innisfree