2016-04-17 15 views
6

Z SymPy mogę wykreślić funkcję z:kreślenie z SymPy

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

Jednak gdybym zdefiniować funkcję jako:

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

Następnie pojawia się błąd informujący:

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

Jak mogę wykreślić f, jeśli zdefiniuję f = a + b, biorąc pod uwagę, że b ma przypisane Tant wartość przed wykreśleniem funkcji?

Odpowiedz

4

linie

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

nie zmieniają b w wyrażeniu. Jeśli wydrukujesz f zobaczysz, że nadal jest zdefiniowany jako a + b.

Mylicie zmienne Pythona z symbolami SymPy. W pierwszym wierszu zmienna Python b wskazuje symbol SymPy o nazwie b (w rzeczywistości nie musi to być ta sama nazwa, można również napisać x = Symbol('b') i y = a + x). W drugim wierszu zmienna f wskazuje na wyrażenie SymPy zawierające symbol b. W trzecim wierszu zmienna b wskazuje na liczbę całkowitą 10. Nie zmienia to żadnych poprzednich wierszy, które używały zmiennej b, ponieważ zostały już uruchomione. To nie jest inaczej niż w przypadku ran

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

Można by oczekiwać, że wartość c w końcu być 2 nie 3. Podobnie, gdy b wskazuje na Symbol, wyrażenia, które tworzysz za jego pomocą, używają Symbolu, ale jeśli zmienisz go tak, by wskazywał na liczbę, nie wpływa to na poprzednie wiersze od kiedy był Symbolem.

Zalecanym sposobem radzenia sobie z tym w SymPy jest uniknięcie przypisania tej samej zmiennej do symbolu, a następnie do nie-symbolu (warto zauważyć, że twoja definicja f w pierwszej linii jest całkowicie bezużyteczna, ponieważ natychmiast zmieniasz definicję w drugim wierszu). Aby zastąpić symbol w wyrażeniu, użyj subs:

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

Zauważ, że subs nie zmienia oryginalnego f. Zwraca nowe wyrażenie.

This document może również pomóc usunąć to zamieszanie.

0

należy zastąpić b do f:

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

Należy unikać używania ciągów jako danych wejściowych do funkcji SymPy. – asmeurer

2

Jeśli nie chcesz używać jako podstawienie w drugiej odpowiedzi, można zrobić f rzeczywista funkcja oczywiście

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