一、问题描述
根据常微分方程,绘制Phase Line以及不同初始值条件下的函数图像。代码本身并不复杂,但是重点是记录一下做的过程中学习到的几个有用的函数。
二、示例
以下是一个人口模型的常微分方程:
N
′
=
N
(
r
?
a
(
N
?
b
)
2
)
N' = N(r-a(N-b)^{2})
N′=N(r?a(N?b)2) 根据
N
′
=
0
N'=0
N′=0可以轻松解得三个fixed points:
N
?
=
0
,
b
?
r
a
,
b
+
r
a
N^{*}=0, b-\sqrt{\frac{r}{a}}, b+\sqrt{\frac{r}{a}}
N?=0,b?ar?
?,b+ar?
?。以下是
N
′
N'
N′的函数图像以及Phase Line
x = np.linspace(0, 4.5, 50)
y = x*(1-(x-3)**2)
plt.ylim(-6, 3)
plt.plot(x, y, label='N\'')
plt.axhline(y=0, linewidth=1, ls='--', color='black')
plt.vlines(x=0, ymin=-6, ymax=0, ls='--', linewidth=1, color='black')
plt.vlines(x=2, ymin=-6, ymax=0, ls='--', linewidth=1, color='black')
plt.vlines(x=4, ymin=-6, ymax=0, ls='--', linewidth=1, color='black')
plt.arrow(1.8, 0, -1.4, 0, width=0.06, color='red')
plt.arrow(2.2, 0, 1.4, 0, width=0.06, color='red')
plt.arrow(4.5, 0, -0.2, 0, width=0.06, color='red')
plt.title('Plot of N\' ' )
plt.yticks([0])
plt.xticks([0, 2, 4], ['0',r'$b-\sqrt{r/a}$', r'$b+\sqrt{r/a}$'])
plt.legend()
plt.savefig('N.jpeg')
以及不同初始值下的函数图像:
plt.xlim(0, 4)
x = np.linspace(0, 4, 100)
y1 = 1.8/(1+e**(-0.4*(x-1)))
y2 = -1.5/(1+e**(-0.3*(x-2)))+3.9
y3 = math.e**(-x)+4
y4 = math.e**(-1.5*(x+0.5))
y5 = -math.e**(-1.5*(x+0.5))+3.9
plt.plot(x, y1)
plt.plot(x, y2)
plt.plot(x, y3)
plt.plot(x, y4)
plt.plot(x, y5)
plt.axhline(y=0, linewidth=1, ls='--', color='black')
plt.axhline(y=2, linewidth=1, ls='--', color='black')
plt.axhline(y=4, linewidth=1, ls='--', color='black')
plt.yticks([0, 2, 4], ['0', r'$b-\sqrt{r/a}$', r'$b+\sqrt{r/a}$'])
plt.xticks([],[])
plt.title(r'$N(t)$ with different initial condition')
plt.savefig('N.jpeg')
三、重要函数
plt.xlm() & plt.ylm() 这两个函数是为图添加x和y的显示范围,我之所以用到这个函数是因为,当我想要画图上所显示的虚线时发现,我是没有办法从图上一点画到最底部的,比如:
x = np.linspace(-1, 1, 10)
y = -x
plt.plot(x, y)
plt.plot([0, 0], [0, -1], ls='--')
plt.savefig('example.jpeg')
但是,如果我为y加上一个范围,就会解决这一问题
plt.ylim(-1, 1)
x = np.linspace(-1, 1, 10)
y = -x
plt.plot(x, y)
plt.plot([0, 0], [0, -1], ls='--')
plt.savefig('example.jpeg')
-
plt.axhline() &plt.axvline() &plt.hlines() &plt.vlines() 这四个函数都是方便画出水平和竖直方向的直线,ax是画单条线,另外两个可以在一个函数里画多条线。 -
plt.xticks() &plt.yticks() 如我示例里两张图一样,有的时候我不想显示横纵坐标上的数字刻度,想要自己定义显示的关键刻度。这个函数里有两个参数,第一个为关键刻度所对应的数字刻度,第二个为显示的关键刻度的文字。如果两个参数都为空就代表不显示刻度。
|