【Python】ODE绘制Phase Line及函数图像

一、问题描述

根据常微分方程,绘制Phase Line以及不同初始值条件下的函数图像。代码本身并不复杂,但是重点是记录一下做的过程中学习到的几个有用的函数。

二、示例

以下是一个人口模型的常微分方程:
N ′ = N ( r − a ( N − b ) 2 ) N' = N(r-a(N-b)^{2}) N=N(ra(Nb)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,bar ,b+ar 。以下是 N ′ N' N的函数图像以及Phase Line

x = np.linspace(0, 4.5, 50)
y = x*(1-(x-3)**2)

# add range for y
plt.ylim(-6, 3)
plt.plot(x, y, label='N\'')

# add vertical and horizontal lines
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')

# add arrow for phase line
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')

# add plot title
plt.title('Plot of N\' ' )

# add important ticks for x and y axies
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')

在这里插入图片描述

三、重要函数
  1. 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')

在这里插入图片描述

  1. plt.axhline()&plt.axvline()&plt.hlines()&plt.vlines()
    这四个函数都是方便画出水平和竖直方向的直线,ax是画单条线,另外两个可以在一个函数里画多条线。

  2. plt.xticks()&plt.yticks()
    如我示例里两张图一样,有的时候我不想显示横纵坐标上的数字刻度,想要自己定义显示的关键刻度。这个函数里有两个参数,第一个为关键刻度所对应的数字刻度,第二个为显示的关键刻度的文字。如果两个参数都为空就代表不显示刻度。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值