我知道这个问题之前已被问过多次,但是我对实施仍存在问题。
这些方程被称为洛塔-沃尔特拉方程,用作两种物种(例如野兔和狐狸)之间的简单生物模型。斜率场图的方程和图像取自这个文件请参阅第 4-7 页以了解完整背景信息。
对于那些看不懂方程式的人来说,它们是du1/dt = u1*(1-u1-a12*u2)
和du2/dt = u2*(1-u2-a21*u1)
。我想画出相图(矢量图)。对于几个值,a12
和有不同的值a21
。结果应该如下
但是我的代码把事情搞得一团糟。
\documentclass[border=10pt]{standalone}
\usepackage{pst-plot,pst-ode}
\begin{document}
\psset{unit=3}
\begin{pspicture}(-0.2,-0.2)(2.1,2.1)
\psaxes[ticksize=0 4pt,axesstyle=frame,tickstyle=inner,subticks=20,
Ox=0,Oy=0](0,0)(2,2)
\psset{arrows=->,algebraic}
\psVectorfield[linecolor=blue!60](0.1,0.1)(1.9,1.9){ x*(-0.75*y-x+1)*(2*y*(-0.75*x-y+1))^(-1) }
%y0_a=-0.5
\pstODEsolve[algebraicOutputFormat]{y0_a}{t | x[0]}{1}{0}{100}{-0.5}{t*(-0.75*x[0]-t+1)*(x[0]*(-0.75*t-x[0]+1))^(-1)}
\psset{arrows=-,linewidth=1pt}%
\listplot[linecolor=red ]{y0_a}
\listplot[linecolor=green]{y0_b}
\listplot[linecolor=blue ]{y0_c}
\end{pspicture}
\end{document}
渲染成
如您所见,箭头有一些严重的扭曲。可以使用除 pstricks 之外的其他工具来解决这个问题吗?我最熟悉的是 tikz 和 pgfplots,但在测试了几个解决方案后使用 pgfplots 绘制微分方程方向图pstricks 是唯一一个能够渲染曲线的人。
如果我从第一个方程中删除第一个u1
,然后删除第一个,u_2
这样我就不会除以零。我仍然会得到伪影(但效果略好一些)。
答案1
不可能一次画完。对于某些值,你需要除以非常小的数字。你必须选择不同的间隔。例如:
\documentclass[border=10pt]{standalone}
\usepackage{pst-plot,pst-ode}
\begin{document}
\psset{unit=3}
\begin{pspicture}(-0.2,-0.2)(2.1,2.1)
\psaxes[ticksize=0 4pt,axesstyle=frame,tickstyle=inner,subticks=20,
Ox=0,Oy=0](0,0)(2,2)
\psset{arrows=->,algebraic}
\pstVerb{
/alpha12 0.75 def
/alpha21 0.75 def
/rho 2 def
}
\psVectorfield[linecolor=blue!60](0.1,0.1)(0.6,0.6)%
{x*(1-x-alpha12*y)/(rho*y*(1-y-alpha21*x))}
\psVectorfield[linecolor=blue!60](0.5,0.7)(1.9,1.9)%
{x*(1-x-alpha12*y)/(rho*y*(1-y-alpha21*x))}
\psVectorfield[linecolor=blue!60](0.1,0.7)(0.3,1.9)%
{x*(1-x-alpha12*y)/(rho*y*(1-y-alpha21*x))}
\pstODEsolve[varsteptol=1e-5,saveData]%
{y0a}%
{0 1}%
{0}{40}{1000}%
{0.1 0.1}%
{x[0]*(1-x[0]-alpha12*x[1]) | rho*x[1]*(1-x[1]-alpha21*x[0])}
\psset{arrows=-,linewidth=1pt}%
\listplot[linecolor=red]{y0a}
\end{pspicture}
\end{document}