2016-05-27 27 views
1

私は方程式を自動的に生成してリストに追加するスクリプトを持っています。Pythonファイルにsympy行列を書く

a、b、c、dすべてのsympy記号。

はその後sympy行列にリストを変換し、ヤコビ行列

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

私は私が別のPythonスクリプトでそれを使用するためにはPythonのファイルでこのヤコビアンを保存したいが計算されます。

現在、私は、文字列のリストを使用して定義を作成して、Pythonのファイルに

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)) 

をそれを書くには、これを行うには良い/より正確な方法はありますか?

+1

これを行うにはこれが最善の方法です。 SymPyは現在CやFortranのような他の言語を対象としたコード生成機能を持っていますが、将来はPythonコードを書く能力が得られます。 – asmeurer

答えて

0

私はあなたのコードを少し簡単にすることができます

ジョブが「forループ」なしで行うことができる

:あなたはこの前に出くわしましたが、あなたは任意のPythonオブジェクトを書くことができるかどう

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

わかりません標準ライブラリのpickle moduleを使用してファイルにコピーします。

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)) 

あなたが他のスクリプトでそれをロードするとき、あなたはこのように戻ってメモリにそのヤコビアンをロードすることができます:これは、あなたがヤコビアンを保存するには、次の操作を行うことができます

import pickle 
import sympy 

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

出力:

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

はい私は認識していますが、バイナリファイルの作成を避けようとしています。 – EDWhyte

+1

これを質問に追加することもできます。 –

関連する問題