关于求解多初值的微分方程的问题(画相平面图)
mathematica吧
全部回复
仅看楼主
level 1
耐心的乐 楼主
我求解x'[t] == y[t], y'[t] == -x[t] + x[t]^3这么一个微分方程,然而在运行的时候报错,说有奇点,该如何解决呢,代码如下。我想要得到的图形如下图所示,请问大佬们该怎么办?
Clear["`*"]
tend = 10;
{x0, y0} = {{0.3, 0.6, 1, 1.2}, {0, 0, 0, 0}};
psol = ParametricNDSolveValue[{x'[t] == y[t], y'[t] == -x[t] + x[t]^3,
x[0] == xi, y[0] == yi}, {x[t], y[t]}, {t, tend}, {xi, yi}];
a = ParametricPlot[
MapThread[psol, {x0, y0}] // Evaluate, {t, 0, tend},
AxesLabel -> {Subscript[x, 1], Subscript[x, 2]}, LabelStyle -> 20]
2019年05月09日 07点05分 1
level 1
你应该简单分析一下要求的微分方程。你给的初值点分成三类,第一类{{0.3,0},{0.6,0}}解是振荡的;第二类{1.2,0},对应y'[0] = -1.2 + 1.2^3>0, 最后解一定会发散掉; 第三类{{1.0,0},{-1.0,0}},,对应y'[0] = -1 + 1或1-1=0,是不动点。
所以报错的原因就是解发散掉了呗。你要加一句条件让解太大时就停止,比如这样:
{x'[t] == y[t], y'[t] == -x[t] + x[t]^3, x[0] == a, y[0] == b, WhenEvent[ Abs[y[t]] > 3, "StopIntegration"]}
就不会发散了。再解决画图问题。对于第一类初值,直接求解画图就可以了
第二类初值也直接求解画图就可以了,但是要限定画图范围,因为这时候解是跑到无穷远的,由于WhenEvent的限制,微分方程在解到 t<0 的某个值时已经停止了(事实上好像是t=1.4)。但是解出的插值函数在定义域之外仍然会给出延拓值。
第三类初值是不动点,你直接取,肯定不演化。想要看到流入流出不动点的流,你把初值稍微偏离一点不动点就可以了,比如将{{1.0,0},{-1.0,0}}改为{{0.9999,0}, {1.000001,0}, {-1.00001,0}, { -0.9999,0}}。这样就可以看到不动点附近的演化了
但这只看到了从一个不动点流到无穷远或另一个不动点的流,还要补上从无穷远或另一个不动点流回来的流,只要做反向的时间演化就ok了,即把方程里的倒数取负号:x'[t]->-x'[t], y'[t]->-y'[t]
最后将这几类解得到的结果show到一起
代码就不放了,问题搞明白之后操作起来都很简单。最后还剩写细活,就是按照流的方向加箭头[汗]
2019年05月19日 18点05分 2
“由于WhenEvent的限制,微分方程在解到 t<0 的某个”,有笔误 应为“ t < 10 ”。第2,3张图是第二类第三类初值一起画的。第二类初值也要把从初值流到无穷远和从无穷远流回初值点的分别画出来。
2019年05月19日 18点05分
1