2016-04-17 10 views
6

Mit SymPy kann ich eine Funktion mit plottenmit SymPy Plotten

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

Dann habe ich einen Fehler besagt:

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

Wie kann ich f plotten, wenn ich f = a + b definiere, wenn man bedenkt, dass ein Nachteil zugeordnet ist tante Wert vor dem Zeichnen der Funktion?

Antwort

4

Die Linien

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

nicht ändern b im Ausdruck. Wenn Sie f drucken, sehen Sie, dass es immer noch als a + b definiert ist.

Sie verwechseln Python-Variablen mit SymPy-Symbolen. In der ersten Zeile zeigt die Python-Variable b auf ein SymPy-Symbol mit dem Namen b (in der Tat müssen sie nicht den gleichen Namen haben; Sie könnten auch x = Symbol('b') und y = a + x geschrieben haben). In der zweiten Zeile zeigt die Variable f auf einen SymPy-Ausdruck, der das Symbol b enthält. In der dritten Zeile zeigt die Variable b auf die Ganzzahl 10. Dies ändert nichts an vorherigen Zeilen, die die Variable b verwendet haben, da sie bereits ausgeführt wurden. Es ist nicht anders, als wenn Sie

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

lief Sie würden den Wert von c am Ende erwarten 2, nicht 3 zu sein. Wenn b auf ein Symbol zeigt, verwenden Ausdrücke, die Sie damit erstellen, ein Symbol. Wenn Sie es jedoch so ändern, dass es auf eine Zahl zeigt, wirkt sich dies nicht auf vorherige Zeilen aus, wenn es ein Symbol war.

Der empfohlene Weg, um dies in SymPy zu behandeln, ist zu vermeiden, die gleiche Variable zu einem Symbol und später zu einem Nicht-Symbol zuzuweisen (es ist erwähnenswert, dass Ihre Definition von f in der ersten Zeile völlig nutzlos ist, da Sie definieren es sofort in der zweiten Zeile). Um ein Symbol in einem Ausdruck zu ersetzen, verwenden subs:

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

Beachten Sie, dass subs nicht die ursprünglichen f ändern. Es gibt einen neuen Ausdruck zurück.

This document kann auch dazu beitragen, diese Verwirrung zu beseitigen.

0

Sie müssen b in f ersetzen:

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

Sie sollten die Verwendung von Zeichenfolgen als Eingabe für SymPy-Funktionen vermeiden. – asmeurer

2

Wenn Sie nicht Substitution wie in der anderen Antwort verwenden wollte, Sie f eine tatsächliche Funktion natürlich machen könnte

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