Wolfram mathematica 如何在NDSolve中施加约束

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/

我有一个关于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/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

  • 考虑DEs
    x'=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

  • 考虑DEs
    x'=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