Reputation: 9
Now I'm solving a problem using euler method. I made it as follow but even though i move the slidr the graph doesn't change
from math import exp
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.widgets import Slider, Button, RadioButtons
for i in range(1,n):
Nlist.append(Nlist[i-1]+dNlist[i-1]*deltat)
Qlist.append(Qlist[i-1]+Qlist[i-1]*deltat)
dNlist.append(Qlist[i]/(1+Qlist[i])*(1-Nlist[i]/Nmax)*Nlist[i])
tlist.append(t0+i*deltat)
x=tlist
y=Nlist
fig=plt.figure()
l=fig.add_subplot(111)
fig.subplots_adjust(left=0.25, bottom=0.25)
l.plot(x,y,linewidth=2,color="red")
plt.xlabel("Value of t")
plt.ylabel("Value of N")
plt.title("Euler Method")
axcolor = 'lightgoldenrodyellow'
axQ0 = fig.add_axes([0.25, 0.15, 0.65, 0.03], axisbg=axcolor)
axNmax = fig.add_axes([0.25, 0.1, 0.65, 0.03], axisbg=axcolor)
axN0 = fig.add_axes([0.25, 0.05, 0.65, 0.03], axisbg=axcolor)
sQ0 = Slider(axQ0, 'init_Temp', 0, 0.1, valinit=Q0)
sNmax = Slider(axNmax, 'N_max', 1000, 100000, valinit=Nmax)
sN0 = Slider(axN0, "init_N",1,10,valinit=N0)
Upvotes: 0
Views: 773
Reputation: 339725
There is an example on how to use Slider
on the Matplotlib page.
In that example one can see that the update
function sets newly created or changed data via the set_ydata()
to the matplotlib.lines.Line2D
object representing the line of the plot.
In the code here, you try to set the data to the matplotlib.axes._subplots.AxesSubplot
object, which will of course not work. It should actually throw and error, 'AxesSubplot' object has no attribute 'set_ydata'
.
So the correct code should plot to an axes
object and save the resulting Line2D
for later usage.
ax=fig.add_subplot(111)
l, = ax.plot(x,y,linewidth=2,color="red")
For completeness, here the full working code:
from __future__ import division
from matplotlib import pyplot as plt
from matplotlib.widgets import Slider
t0=0
Q0=0.001
tf=25
N0=5
Nmax=10000
dN0=Q0/(1+Q0)*(1-N0/Nmax)*N0
n=100
deltat=(tf-t0)/(n-1)
tlist=[t0]
Nlist=[N0]
Qlist=[Q0]
dNlist=[dN0]
for i in range(1,n):
Nlist.append(Nlist[i-1]+dNlist[i-1]*deltat)
Qlist.append(Qlist[i-1]+Qlist[i-1]*deltat)
dNlist.append(Qlist[i]/(1+Qlist[i])*(1-Nlist[i]/Nmax)*Nlist[i])
tlist.append(t0+i*deltat)
x=tlist
y=Nlist
fig=plt.figure()
#########
### Changes here:
ax=fig.add_subplot(111)
fig.subplots_adjust(left=0.25, bottom=0.25)
l, = ax.plot(x,y,linewidth=2,color="red")
###########
plt.xlabel("Value of t")
plt.ylabel("Value of N")
plt.title("Euler Method")
axcolor = 'lightgoldenrodyellow'
axQ0 = fig.add_axes([0.25, 0.15, 0.65, 0.03], axisbg=axcolor)
axNmax = fig.add_axes([0.25, 0.1, 0.65, 0.03], axisbg=axcolor)
axN0 = fig.add_axes([0.25, 0.05, 0.65, 0.03], axisbg=axcolor)
sQ0 = Slider(axQ0, 'init_Temp', 0, 0.1, valinit=Q0)
sNmax = Slider(axNmax, 'N_max', 1000, 100000, valinit=Nmax)
sN0 = Slider(axN0, "init_N",1,10,valinit=N0)
def update(val):
ini_Q = sQ0.val
ini_Nmax = sNmax.val
ini_N =sN0.val
ini_dN=ini_Q/(1+ini_Q)*(1-ini_N/ini_Nmax)*ini_N
tlist2=[t0]
Nlist2=[ini_N]
Qlist2=[ini_Q]
dNlist2=[ini_dN]
for i in range(1,n):
Nlist2.append(Nlist2[i-1]+dNlist2[i-1]*deltat)
Qlist2.append(Qlist2[i-1]+Qlist2[i-1]*deltat)
dNlist2.append(Qlist2[i]/(1+Qlist2[i])*(1-Nlist2[i]/ini_Nmax)*Nlist2[i])
tlist2.append(t0+i*deltat)
l.set_ydata(Nlist2)
fig.canvas.draw_idle()
sQ0.on_changed(update)
sNmax.on_changed(update)
sN0.on_changed(update)
plt.show()
Upvotes: 1