Wolfram mathematica 如何在NDSolve中施加约束
我有一个关于Mathematica和Solve中的约束的问题 如果我有两个线性微分方程Wolfram mathematica 如何在NDSolve中施加约束,wolfram-mathematica,Wolfram Mathematica,我有一个关于Mathematica和Solve中的约束的问题 如果我有两个线性微分方程 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 随时 谢谢请尝试以下示例: DSolve[{x'[t] == A x[t] + B (1 - x[t]), x[0] == 2/
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
随时
谢谢请尝试以下示例:
DSolve[{x'[t] == A x[t] + B (1 - x[t]), x[0] == 2/10}, x[t], t]
例如:
DSolve[{x'[t] == A x[t] + B (1 - x[t]), x[0] == 2/10}, x[t], t]
答案是,一般来说,你不能。这不是数学的局限,而是数学的局限 您试图同时求解三个方程:
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
来解决(有或没有常量的固定值):
但是,需要注意的是,对于三个函数方程和两个函数,不能同时求解所有方程。这就是为什么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使其不一致(因此我的三张图不一致)。你可以随意使用操纵或其他东西来查看它们之间的关系,但我有两种基本方法来确定如何(如果有的话)强制所有三个方程的解保持一致:
只需区分1=x+y
。这将为您提供0=x'+y'
,这意味着您始终具有限制ax+by=cx+dy
,换句话说y=(c-a)/(b-d)x
。这实际上与原始约束不一致x+y=1
考虑DEsx'=ax+by
和y'=cx+dy
的线性系统。为了使解成为一条直线,它必须在特征向量的方向上,并且必须通过原点。您的约束x+y=1
是一条不符合这些标准的线,因此两个DEs的任何解都不会满足您的代数方程
PS我想你的原始代码有一个输入错误。你可能想要{t,010000}
是吗?答案是一般来说你不能。这不是数学的局限,而是数学的局限
您试图同时求解三个方程:
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
来解决(有或没有常量的固定值):
但是,需要注意的是,对于三个函数方程和两个函数,不能同时求解所有方程。这就是为什么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使其不一致(因此我的三张图不一致)。你可以随意使用操纵或其他东西来查看它们之间的关系,但我有两种基本方法来确定如何(如果有的话)强制所有三个方程的解保持一致:
只需区分1=x+y
。这将为您提供0=x'+y'
,这意味着您始终具有限制ax+by=cx+dy
,换句话说y=(c-a)/(b-d)x
。这实际上与原始约束不一致x+y=1
考虑DEsx'=ax+by
和y'=cx+dy
的线性系统。为了使解成为一条直线,它必须在特征向量的方向上,并且必须通过原点。您的约束x+y=1
是一条不符合这些标准的线,因此两个DEs的任何解都不会满足您的代数方程
PS我想你的原始代码有一个输入错误。你可能想要{t,010000}
是吗?首先,t=0时不是这样。好吧,你说得对,让x[0]==0.2和y[0]==0.8。。。我怎么能在任何时候保持这个宽度x[t]+y[t]=1呢?在修正了一些语法之后,你可以替换{y[t]>1-x[t],y'[t]>-x'[t]}
并解出x[t]
的结果方程。谢谢,但是如果x[t]+y[t]==1
那么x'[t]=-y'[t]
,你只需要一个方程。另外,NDSolve[]
仅适用于数值问题(即没有像A、B……这样的符号常量)。对于初学者来说,它不是t