2016-05-27 18 views
1

Ich habe ein Skript, das automatisch Gleichungen generiert und sie zu einer Liste hinzufügt.Schreiben Sie eine Sympy-Matrix in eine Python-Datei

z.B. :

eq = [a*b, a + b*c -d, c**2 + a, d*a - 2] 

mit a, b, c, d alle sympy Symbole.

Er wandelt dann die Liste in eine sympy Matrix und berechnet die Jacobi-Matrix

eq = sympy.Matrix(eq) 
jacobi = eq.jacobian([a, b, c, d]) 

Ich mag diese jacobian in einer Python-Datei speichern, um für mich in einem anderen Python-Skript zu verwenden.

Derzeit erstelle ich eine Definition eine Liste von Strings mit und schreiben Sie es auf eine Python-Datei

variable_list = [a, b, c, d] 

jacobian_lines = ["def jacobian(variables):", 
          ' """ Returns the evaluated jacobian matrix', 
          ' :param variables: a list of numeric values to evaluate the jacobian', 
          ' """', '', ' {} = variables'.format(str(variable_list)), '', 
          ' j = {}'.format(jacobi), '', " return j"] 

file_path = 'jacobian.py' 
file = open(file_path, 'w') 

for line in jacobian_lines: 
    file.write('{}\n'.format(line)) 

Gibt es eine korrektere/besseren Weg, dies zu tun?

+1

Dies ist der beste Weg, es jetzt zu tun. SymPy verfügt über Funktionen zur Codegenerierung, die derzeit auf andere Sprachen wie C und Fortran ausgerichtet sind. Hauptsächlich erhalten sie jedoch die Fähigkeit, in Zukunft Python-Code zu schreiben, wodurch solche Dinge leichter geschrieben werden können. – asmeurer

Antwort

0

Ich kann Ihren Code wenig einfacher machen

Der Job kann ohne ‚for-Schleife‘ erfolgen:

variable_list = [a, b, c, d] 

jacobian_lines = ["def jacobian(variables):", 
          ' """ Returns the evaluated jacobian matrix', 
          ' :param variables: a list of numeric values to evaluate the jacobian', 
          ' """', '', ' {} = variables'.format(str(variable_list)), '', 
          ' j = {}'.format(jacobi), '', " return j"] 

file_path = 'jacobian.py' 
file = open(file_path, 'w').write('\n'.join(jacobian_lines)) 
0

Nicht sicher, ob man auf diese haben, bevor kam aber Sie können beliebige Python-Objekte schreiben in eine Datei mit der pickle module aus der Standardbibliothek. Dies würde ermöglichen es Ihnen, die folgenden tun, um die jacobian zu speichern:

import pickle 
import sympy 

a = sympy.symbols('a') 
b = sympy.symbols('b') 
c = sympy.symbols('c') 
d = sympy.symbols('d') 

eq = [a*b, a + b*c -d, c**2 + a, d*a - 2] 
eq = sympy.Matrix(eq) 
jacobi = eq.jacobian([a, b, c, d]) 

with open('~/Desktop/jacobian.pickle', 'wb') as outf: 
    outf.write(pickle.dumps(jacobi)) 

Dann, wenn Sie es in Ihrem anderen Skript laden wollen, dass jacobian zurück in den Speicher wie folgt laden:

import pickle 
import sympy 

with open('~/Desktop/jacobian.pickle', 'rb') as inf:  
    jacobi = pickle.loads(inf.read()) 
print(jacobi) 

Ausgänge :

Matrix([ 
[b, a, 0, 0], 
[1, c, b, -1], 
[1, 0, 2*c, 0], 
[d, 0, 0, a]]) 
+0

Ja, ich bin mir bewusst, aber ich versuche zu vermeiden, Binärdateien zu schreiben. – EDWhyte

+1

Vielleicht möchten Sie das zur Frage hinzufügen. –