2016-05-27 100 views
1

我有一個腳本,它會自動生成方程並將它們添加到列表中。將sympy矩陣寫入python文件

例如:

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

與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循環」來完成:

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

不知道,如果你已經跨過這之前來到,但你可以寫任意Python對象到使用標準庫中的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

您可能想將其添加到問題中。 –