Maple,数值函数的最大值
Maple, maximum value of a numeric function
我正在尝试使用 Maple 计算具有两个 ODE 的系统解的最大值。我首先解决了系统本身:
> with(DEtools):with(plots):
> a1:=0.00875;a2:=0.075;b1:=7.5;b2:=2.5;d1:=0.0001;d2:=0.0001;g:=4*10^(-8);K1:=5000;K2:=2500;n:=2;m:=2;
> dsol:= dsolve({
diff( x(t), t ) = a1+b1*x(t)^n/(K1^n+x(t)^n)-g*x(t)*y(t)-d1*x(t),
diff( y(t), t ) = a2+b2*x(t)^m/(K2^m+x(t)^m)-d2*y(t),
x(0) = 1000, y(0) = 1000}, numeric, output = listprocedure);
> xt:= eval( x(t), dsol );
yt:= eval( y(t), dsol );
> X:=plot(xt(t),t=0..50000,color=blue,legend="x(t)"):
Y:=plot(yt(t),t=0..50000,color=green,legend="y(t)"):
> display([X,Y]);
我在xt和yt上得到了系统的解,但是都是数值解。因此,Maple maximize()函数不起作用:
> maximize(xt);
> maximize(xt(t),t=0..20000);
是否可以使用 Maple 计算数值函数的最大值?
你的两条曲线 xt
和 yt
在你的 t=0..50000
范围内各有一个局部最大值,所以你可以使用 Optimization
包直截了当的方式。
restart;
with(plots):
a1:=0.00875: a2:=0.075: b1:=7.5: b2:=2.5: d1:=0.0001:
d2:=0.0001: g:=4*10^(-8): K1:=5000: K2:=2500: n:=2: m:=2:
dsol:= dsolve({diff(x(t),t)=a1+b1*x(t)^n/(K1^n+x(t)^n)-g*x(t)*y(t)-d1*x(t),
diff(y(t),t)=a2+b2*x(t)^m/(K2^m+x(t)^m)-d2*y(t),
x(0)=1000, y(0)=1000}, numeric, output=listprocedure):
xt:= eval(x(t), dsol):
yt:= eval(y(t), dsol):
X:=plot(xt(t), t=0..50000, color=blue, legend="x(t)"):
Y:=plot(yt(t), t=0..50000, color=green, legend="y(t)"):
xmax:=Optimization:-Maximize(xt, 0..50000):
[xmax[2][1],xmax[1]];
[9460.78688552799, 11193.0618953179]
ymax:=Optimization:-Maximize(yt, 0..50000):
[ymax[2][1],ymax[1]];
[21471.8648785947, 19006.6009784691]
display( Y, pointplot([[ymax[2][1],ymax[1]]], symbolsize=20),
X, pointplot([[xmax[2][1],xmax[1]]], symbolsize=20) );
对于您的简单示例,效果很好。
如果您的 xt
或 yt
有很多局部最大值,您可以尝试使用其 method=branchandbound
选项调用 Maximize
。
然后还有其他方法,您可以使用新的因变量来扩充您的 DE 系统,例如 xd(t)=diff(x(t),t)
(以及适当的 IC)并让 dsolve/numeric 本身注意到它何时变为使用 events
设施为零(极值点),或在其上使用 fsolve
。
我正在尝试使用 Maple 计算具有两个 ODE 的系统解的最大值。我首先解决了系统本身:
> with(DEtools):with(plots):
> a1:=0.00875;a2:=0.075;b1:=7.5;b2:=2.5;d1:=0.0001;d2:=0.0001;g:=4*10^(-8);K1:=5000;K2:=2500;n:=2;m:=2;
> dsol:= dsolve({
diff( x(t), t ) = a1+b1*x(t)^n/(K1^n+x(t)^n)-g*x(t)*y(t)-d1*x(t),
diff( y(t), t ) = a2+b2*x(t)^m/(K2^m+x(t)^m)-d2*y(t),
x(0) = 1000, y(0) = 1000}, numeric, output = listprocedure);
> xt:= eval( x(t), dsol );
yt:= eval( y(t), dsol );
> X:=plot(xt(t),t=0..50000,color=blue,legend="x(t)"):
Y:=plot(yt(t),t=0..50000,color=green,legend="y(t)"):
> display([X,Y]);
我在xt和yt上得到了系统的解,但是都是数值解。因此,Maple maximize()函数不起作用:
> maximize(xt);
> maximize(xt(t),t=0..20000);
是否可以使用 Maple 计算数值函数的最大值?
你的两条曲线 xt
和 yt
在你的 t=0..50000
范围内各有一个局部最大值,所以你可以使用 Optimization
包直截了当的方式。
restart;
with(plots):
a1:=0.00875: a2:=0.075: b1:=7.5: b2:=2.5: d1:=0.0001:
d2:=0.0001: g:=4*10^(-8): K1:=5000: K2:=2500: n:=2: m:=2:
dsol:= dsolve({diff(x(t),t)=a1+b1*x(t)^n/(K1^n+x(t)^n)-g*x(t)*y(t)-d1*x(t),
diff(y(t),t)=a2+b2*x(t)^m/(K2^m+x(t)^m)-d2*y(t),
x(0)=1000, y(0)=1000}, numeric, output=listprocedure):
xt:= eval(x(t), dsol):
yt:= eval(y(t), dsol):
X:=plot(xt(t), t=0..50000, color=blue, legend="x(t)"):
Y:=plot(yt(t), t=0..50000, color=green, legend="y(t)"):
xmax:=Optimization:-Maximize(xt, 0..50000):
[xmax[2][1],xmax[1]];
[9460.78688552799, 11193.0618953179]
ymax:=Optimization:-Maximize(yt, 0..50000):
[ymax[2][1],ymax[1]];
[21471.8648785947, 19006.6009784691]
display( Y, pointplot([[ymax[2][1],ymax[1]]], symbolsize=20),
X, pointplot([[xmax[2][1],xmax[1]]], symbolsize=20) );
对于您的简单示例,效果很好。
如果您的 xt
或 yt
有很多局部最大值,您可以尝试使用其 method=branchandbound
选项调用 Maximize
。
然后还有其他方法,您可以使用新的因变量来扩充您的 DE 系统,例如 xd(t)=diff(x(t),t)
(以及适当的 IC)并让 dsolve/numeric 本身注意到它何时变为使用 events
设施为零(极值点),或在其上使用 fsolve
。