Reputation: 14851
With SymPy, I can plot a function with:
f, a = symbols('f a')
f = a + 10
plot(f)
However, if I define the function as:
f, a, b = symbols('f a b')
f = a + b
b = 10
plot(f)
Then I get an error stating:
ValueError: The same variable should be used in all univariate
expressions being plotted.
How can I plot f
if I define f = a + b
, considering that b
is assigned a constant value before plotting the function?
Upvotes: 6
Views: 3264
Reputation: 29740
If you didn't want to use substitution as in the other answer, you could make f
an actual function of course
def f(a, b):
return a + b
a = symbols('a')
b = 10
plot(f(a,b))
Upvotes: 2
Reputation: 91680
The lines
f, a, b = symbols('f a b')
f = a + b
b = 10
don't change b
in the expression. If you print f
you'll see that it is still defined as a + b
.
You are confusing Python variables with SymPy symbols. In the first line, the Python variable b
points to a SymPy symbol named b
(in fact, they need not be the same name; you could have also written x = Symbol('b')
and y = a + x
). In the second line, the variable f
points to a SymPy expression containing the symbol b
. In the third line, the variable b
points to the integer 10. This doesn't not change any previous lines that used the variable b
, since they have already been run. It's no different than if you ran
a = 1
b = 1
c = a + b
b = 2
You would expect the value of c
at the end to be 2
, not 3
. Similarly, when b
points to a Symbol, expressions you create with it use a Symbol, but if you change it to point to a number, it doesn't affect previous lines from when it was a Symbol.
The recommended way to deal with this in SymPy is to avoid assigning the same variable to a symbol and then later to a non-symbol (it's worth pointing out that your definition of f
in the first line is completely useless, since you immediately redefine it in the second line). To replace a symbol in an expression, use subs:
a, b = symbols('a b')
f = a + b
f1 = f.subs(b, 10)
Note that subs
does not change the original f
. It returns a new expression.
This document may also help clear this confusion up.
Upvotes: 5