【问题标题】:sympy unknown assignment同情未知任务
【发布时间】:2020-02-29 20:32:53
【问题描述】:

我正在尝试创建一个用于求解方程的 python 程序:

from sympy import symbols, Eq, solve

list1 = ['x', 'y']                 #<--- Letters of the user input
list1[0] = symbols(list1[0])       #<--- Assignment of the unknown x
list1[1] = symbols(list1[1])       #<--- Assignment of the unknown y
eq1 = Eq(x*2 - 5*x + 6 + y, 0)     #<--- Equation
res = solve(eq1, dict=True)        #<--- Solving
print(res)

我想为 'list1' 的第一个和第二个对象分配一个值,在本例中为 'x = symbols('x')' 和 'y = symbols('y')'。所以我尝试用 list1[0] 替换“x”,用 list1[1] 替换“y”,因为它可以是基于用户输入的任何字母。但是脚本仍然在第六行说“x 未定义”。那么,有没有办法给数组中的某一项赋值呢?

【问题讨论】:

  • 在方程线上,x 和 y 应该从哪里来?那是你想要的符号中的 x 和 y 吗?

标签: python-3.x sympy equation-solving


【解决方案1】:

当您开始使用 SymPy 时,需要一段时间才能弄清 SymPy 对象和 Python 变量之间的区别。请记住,每个变量都是 Python 变量,分配给它的内容取决于您。

在第 6 行中,您想使用变量 xy。您可以查看前面几行,发现您从未定义过x(它必须在= 的左上角)。这将纠正这种情况:

>>> x, y = map(Symbol, list1)

就字符串而言,list1 中的内容无关紧要。他们甚至可以是['a', 'b']。无论它们是什么,它们都将用于创建 SymPy 符号,并将它们分配给 Python 变量 xy。然后它们将出现在您正在求解的方程的结果中:

>>> list1 = list('ab')
>>> x, y = map(Symbol, list1)
>>> solve(Eq(x*2 - 5*x + 6 + y, 0), dict=True)
[{a: b/3 + 2}]

【讨论】:

    【解决方案2】:

    问题在于您是在列表的上下文中创建符号。

    当您执行等式时,Python 没有找到变量“x”或“y”,因为它们在列表之外没有暴露/可见。

    你可以试试:

    eq1 = Eq(list1[0]*2 - 5*list1[0] + 6 + list1[1], 0)
    

    得到结果但并不漂亮

    或者以下应该可以工作:

    x = Symbol('a')
    y = Symbol('y')
    eq1 = Eq(x*2 - 5*x + 6 + y, 0)
    

    但如果你真的想要模块中暴露的符号,你可以这样做:

    def symbol_references(in_list):
        for e in in_list:
           globals()[e] = Symbol(e)
    
    symbol_references(['x', 'y'])
    print(type(x))
    print(type(y))
    

    【讨论】:

      猜你喜欢
      • 2015-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-23
      • 1970-01-01
      • 2018-12-28
      • 2012-04-13
      • 2021-10-05
      相关资源
      最近更新 更多