首页 文章

写一个sympy矩阵到python文件

提问于
浏览
1

我有一个自动生成方程式的脚本,并将它们添加到列表中 .

例如:

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

有没有更正确/更好的方法来做到这一点?

2 回答

  • 0

    我可以让你的代码变得简单

    这项工作可以在没有'for loop'的情况下完成:

    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将任意Python对象写入文件 . 这将允许您执行以下操作以保存雅可比:

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

相关问题