我有一个自动生成方程式的脚本,并将它们添加到列表中。
e.g。 :
eq = [a*b, a + b*c -d, c**2 + a, d*a - 2]
用a,b,c,d表示所有符号。
然后将列表转换为sympy矩阵并计算雅可比矩阵
eq = sympy.Matrix(eq)
jacobi = eq.jacobian([a, b, c, d])
我想将这个jacobian保存在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))
有更正确/更好的方法吗?
答案 0 :(得分: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))
答案 1 :(得分:0)
不确定您之前是否遇到此问题,但您可以使用标准库中的pickle module将任意Python对象写入文件。这将允许您执行以下操作来保存jacobian:
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))
然后当你想在其他脚本中加载它时,可以将jacobian加载到内存中,如下所示:
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]])