使用SymPy绘图

6

使用 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,并且在绘制函数之前赋值b一个常量值,那么我该如何绘制f?

3个回答

5

这些行

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。它返回一个新的表达式。 这篇文档也可能有助于澄清这种困惑。

2

如果您不想像其他答案中那样使用替换,当然可以将f作为实际函数

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

1

你必须将 b 替换为 f:

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

2
你应该避免将字符串作为SymPy函数的输入。 - asmeurer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接