【问题标题】:Convert list of strings SymPy to symbols and use in solveset将 SymPy 字符串列表转换为符号并在求解集中使用
【发布时间】:2022-07-15 23:16:24
【问题描述】:

帖子“How can I convert a list of strings into sympy variables?”讨论了如何从字符串列表生成 SymPy 符号。我的问题是在 SymPy 计算中使用这些符号 x、y 和 z 需要哪些步骤?

我尝试了一些类似的东西

from sympy import symbols, solveset

var_as_strings = ['x', 'y', 'z']
var_as_symbol_objects = [sympy.symbols(v) for v  in var_as_strings]
var_as_symbol_objects

for x1, x2 in zip(var_as_symbol_objects, var_as_strings):
    x1 = symbols(x2)

soln = solveset(x-y-z, x)

但我收到错误“NameError:未定义名称'x'”。非常感谢任何帮助。

【问题讨论】:

    标签: python sympy


    【解决方案1】:

    the documentation 中列出的第一个问题回答了这个问题。

    您需要手动将符号存储到所需的变量中 (x = symbols('x')),或从 sympy.abc (from sympy.abc import x) 导入它们。

    发生名称错误是因为您尚未在代码中定义 x、y 或 z 的内容。

    【讨论】:

    • 感谢您的回答。但问题是我的列表中有很多项目我希望仅使用字符串列表将其定义为符号(手动执行不是一个选项)......有没有办法编写一个定义的循环列表中的所有字符串都作为符号?
    • 您已经在第三行(非空)代码中完成了该操作,但这不会将它们添加到您的全局命名空间中 - 您只是将符号存储到列表中。您可能需要手动将它们插入到全局命名空间中,但我认为这是一件非常危险且令人费解的事情。如果你需要大量的符号,你最好只导入from sympy.abc import *。
    【解决方案2】:

    您可以使用 var 从字符串列表(或空格或逗号分隔的名称字符串)在当前命名空间中创建 Python 变量:

    >>> names = 'x y z'  # or 'x, y, z'
    >>> var(names)
    (x, y, z)
    >>> var(list('xyz'))
    [x, y, z]
    >>> var(set('xyz'))
    {x, y, z}
    

    在所有情况下,发出var 命令后,您将能够使用已分配有同名 SymPy 符号的变量。

    【讨论】:

      【解决方案3】:

      我的列表中有很多我想定义为符号的项目

      仅供参考,一个可以自动以增强方式定义符号的sn-p

      nmax = 7
      names = ["phi" + str(i) for i in range(nmax)]
      sympy_vars = [symbols("\\" + name.replace("phi", "phi_")) for name in names]
      globals().update(dict(zip(names, sympy_vars)))
      phi0
      

      这会在 jupyter notebooks 等中产生很好的 LaTeX 类型输出。

      【讨论】:

        猜你喜欢
        • 2022-11-18
        • 1970-01-01
        • 1970-01-01
        • 2014-09-18
        • 1970-01-01
        • 2013-12-05
        • 2010-11-17
        • 2021-10-04
        相关资源
        最近更新 更多