我对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
谢谢
答案 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
(对于第二个和第三个,您需要x0
和y0
总和为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=x+y
。这为您提供0=x'+y'
,这意味着您始终拥有限制ax+by=cx+dy
,换句话说y=(c-a)/(b-d)x
。这实际上与您的原始约束x+y=1
不一致。
考虑DE x'=ax+by
和y'=cx+dy
的线性系统。为了使解决方案成为直线,它必须在特征向量的方向上并且必须通过原点。你的约束x+y=1
是一条不符合这些标准的行,因此这两个DE的解决方案都不能满足你的代数方程。
PS我认为您的原始代码中有拼写错误。你可能想要{t,0,10000}
是吗?
答案 1 :(得分:-1)
试着举例:
DSolve[{x'[t] == A x[t] + B (1 - x[t]), x[0] == 2/10}, x[t], t]