【问题标题】:Plotting with SymPy用 SymPy 绘图
【发布时间】:2016-08-09 15:13:56
【问题描述】:

使用 SymPy,我可以绘制一个函数:

f, a = symbols('f a')
f = a + 10
plot(f)

但是,如果我将函数定义为:

f, a, b = symbols('f a b')
f = a + b
b = 10
plot(f)

然后我收到一条错误消息:

ValueError: The same variable should be used in all univariate
            expressions being plotted.

如果我定义f = a + b,我如何绘制f,考虑到b 在绘制函数之前被分配了一个常数值?

【问题讨论】:

    标签: python sympy


    【解决方案1】:

    线条

    f, a, b = symbols('f a b')
    f = a + b
    b = 10
    

    不要更改表达式中的b。如果你打印f,你会看到它仍然被定义为a + b

    您将 Python 变量与 SymPy 符号混淆了。在第一行,Python 变量b 指向一个名为b 的SymPy 符号(事实上,它们不必同名;你也可以写成x = Symbol('b')y = a + x)。在第二行中,变量f 指向一个包含符号b 的SymPy 表达式。在第三行中,变量b 指向整数10。这不会改变之前使用变量b 的任何行,因为它们已经运行过了。这和你跑步没什么不同

    a = 1
    b = 1
    c = a + b
    b = 2
    

    您会期望c 的值最后是2,而不是3。同样,当b 指向一个符号时,您使用它创建的表达式使用一个符号,但如果您将其更改为指向一个数字,它不会影响之前的行,因为它是一个符号。

    在 SymPy 中处理此问题的推荐方法是避免将相同的变量分配给符号,然后再分配给非符号(值得指出的是,您在第一行中对 f 的定义完全没用,因为您立即在第二行重新定义它)。要替换表达式中的符号,请使用 subs:

    a, b = symbols('a b')
    f = a + b
    f1 = f.subs(b, 10)
    

    注意subs 不会改变原来的f。它返回一个新表达式。

    This document 也可能有助于消除这种困惑。

    【讨论】:

      【解决方案2】:

      如果您不想像其他答案那样使用替换,您当然可以将 f 设为实际功能

      def f(a, b):
          return a + b
      a = symbols('a')
      b = 10
      plot(f(a,b))
      

      【讨论】:

        【解决方案3】:

        你必须将 b 代入 f:

        plot(f.subs('b', b))
        

        【讨论】:

        • 你应该避免使用字符串作为 SymPy 函数的输入。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-25
        • 1970-01-01
        • 2023-01-11
        • 2018-04-08
        • 2019-04-16
        • 2016-02-26
        • 1970-01-01
        相关资源
        最近更新 更多