如何在NDSolve中强加约束

时间:2013-06-07 10:10:16

标签: wolfram-mathematica

我对Mathematica NDSolve中的约束有疑问

如果我有两个线性微分方程

NDSolve[x'[t]= A x[t]+B y[t], 
        y'[t]= C x[t]+D y[t], 
        x[0]==0.002, y[0]==0.005, {x,y}, {t,0.10000}]

如何施加约束

x[t]+y[t] == 1 

任何时间t

谢谢

2 个答案:

答案 0 :(得分:0)

答案是,一般情况下你不能。这不是Mathematica的限制,它是数学的限制。

您正在尝试同时解决三个方程式:

x' = Ax+By
y' = Cx+Dy
1 = x + y

我将使用小写a,b,c,d来避免Mathematica的问题。

belisarius建议,您无需手动进行替换。您可以简单地选择其中任何两个,并要求Mathematica解决:

a = 1; b = 2; c = 3; d = 4; x0 = 0.2; y0 = 0.8;

NDSolve[{x'[t] == a x[t] + b y[t], y'[t] == c x[t] + d y[t], 
 x[0] == x0, y[0] == y0}, {x[t], y[t]}, {t, 0, 1000}];
Plot[Evaluate[ReplaceAll[{x[t], y[t]}, %]], {t, 0, 0.01}]

NDSolve[{x'[t] == a x[t] + b y[t], x[t]+y[t]==1, 
 x[0] == x0, y[0] == y0}, {x[t], y[t]}, {t, 0, 1000}];
Plot[Evaluate[ReplaceAll[{x[t], y[t]}, %]], {t, 0, 0.01}]

NDSolve[{y'[t] == c x[t] + d y[t], x[t]+y[t]==1,
 x[0] == x0, y[0] == y0}, {x[t], y[t]}, {t, 0, 1000}];
Plot[Evaluate[ReplaceAll[{x[t], y[t]}, %]], {t, 0, 0.01}]

请注意,对于其中任何一个都有效,您需要指定常量a,b,c,d,x0,y0(对于第二个和第三个,您需要x0y0总和为1 )。

我正在使用NDSolve,正如您所问,虽然其中任何一个也可以通过DSolve来解决(使用或不使用常量的固定值):

Clear[a,b,c,d,x0,y0];

DSolve[{x'[t] == a x[t] + b y[t], y'[t] == c x[t] + d y[t], 
 x[0] == x0, y[0] == y0}, {x[t], y[t]}, t]

DSolve[{x'[t] == a x[t] + b y[t], x[t]+y[t]==1, 
 x[0] == x0, y[0] == 1-x0}, {x[t], y[t]}, t]

DSolve[{y'[t] == c x[t] + d y[t], x[t]+y[t]==1,
 x[0] == x0, y[0] == 1-x0}, {x[t], y[t]}, t]

然而,值得注意的是,通过三个函数方程和两个函数,您无法同时解决所有这些问题。这就是NDSolve生成的三个图表和DSolve生成的三个解决方案的原因不同的原因。请注意,我必须通过将1-x0作为初始值,在后两种情况下明确强制x [0] + y [0] = 1。

因为您有三个方程式,所以要么系统不一致或超定。如果你试图同时解决这三个问题,Mathematica会给出一个错误:

NDSolve::overdet:
"There are fewer dependent variables, {x[t],y[t]}, than equations, so the
system is overdetermined."

(类似于DSolve。)

我对a=1,b=2,c=3,d=4的选择使其不一致(因此我的三张图不同意)。您可以使用Manipulate或其他东西来查看它们之间的关系,但我有两种基本方法可以帮助您确定如何强制解决方案(如果有的话)所有三个方程都是一致的:

  1. 区分1=x+y。这为您提供0=x'+y',这意味着您始终拥有限制ax+by=cx+dy,换句话说y=(c-a)/(b-d)x。这实际上与您的原始约束x+y=1不一致。

  2. 考虑DE x'=ax+byy'=cx+dy的线性系统。为了使解决方案成为直线,它必须在特征向量的方向上并且必须通过原点。你的约束x+y=1是一条不符合这些标准的行,因此这两个DE的解决方案都不能满足你的代数方程。

  3. PS我认为您的原始代码中有拼写错误。你可能想要{t,0,10000}是吗?

答案 1 :(得分:-1)

试着举例:

DSolve[{x'[t] == A x[t] + B (1 - x[t]), x[0] == 2/10}, x[t], t]