- 注册时间
- 2015-8-20
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 1403
- 在线时间
- 小时
|
本帖最后由 Jack315 于 2024-12-28 07:17 编辑
是模型设置问题:
在模型内,一种树砍光之后不是维持在零,而是成了负数。设置下限值为 0 应该就行了。
【更正图】
硬木树被砍光,软木树疯长 \((x=165,y=20)\)
软木树被砍光,硬木树疯长 \((x=90,y=45)\) :
可行域:
兰色区域是硬木树被砍光;红色区域是软木树被砍光。
在可行域的尖角处(~180,~90)右上角,【可能】是一条脆弱的平衡曲线(不稳定不动点)。
计算可行域的 Matlab 代码:
- clear
- w = warning;
- warning('off');
- nh = 200;
- ns = 100;
- hdata = zeros(nh, ns, 3);
- sdata = zeros(nh, ns, 3);
- tspan = [0 1000];
- y0 = [10000 6000];
- for h = 1 : nh
- for s = 1 : ns
- [t,y] = ode45(@(t,y) odefcn(t,y,h-1,s-1), tspan, y0);
- hdata(h, s, 1) = h;
- hdata(h, s, 2) = s;
- hdata(h, s, 3) = CrossZero(t, y(:,1));
- sdata(h, s, 1) = h;
- sdata(h, s, 2) = s;
- sdata(h, s, 3) = CrossZero(t, y(:,2));
- end
- end
- warning(w);
复制代码
微分方程函数:
- function dydt = odefcn(t,y,h,s)
- dydt = zeros(2,1);
- dydt(1) = 0.1*y(1)-0.00001*y(1)^2-0.000005*y(1)*y(2)-h;
- dydt(2) = 0.25*y(2)-0.00004*y(2)^2-0.00002*y(1)*y(2)-s;
- end
复制代码
过零点数据提取函数:
- function tzero = CrossZero(t, y)
- ymin = min(y);
- if ymin < 0
- k = find(y > 0, 1, 'last');
- % 过零时间。
- t0 = t(k); t1 = t(k + 1);
- y0 = y(k); y1 = y(k + 1);
- tzero = (t1 - t0) / (y1 - y0) * (0 - y0) + t0;
- else
- tzero = nan;
- end
- end
复制代码
【猜想】
在特定的模型参数下,有可能导致 \(h(t)\) 和 \(s(t)\) 出现振荡,形成二维“吸引子”。 |
|