【问题标题】:Mathematica about NDsolve PDE setMathematica 关于 NDsolve PDE 集
【发布时间】:2013-10-03 05:32:58
【问题描述】:

我正在尝试使用 NDsolve 函数来求解 PDE 集。

我对mathematica很陌生,这是我输入的代码。

NDSolve[{D[Cm[t, x], t] == Dm*D[Cm[t, x], x, x] + Kg*Cs[t, x] - Ka*Cm[t, x],
    D[Cs[t, x], t] == Ds*D[Cs[t, x], x, x] + Ka*Cm[t, x] - Kg*Cs[t, x],
    Cm[0, x] == Cm0,
    Cs[0, x] == Cs0,
    Dm*ND[Cm[t, 0]] == 0.5*FT,
    Ds*ND[Cs[t, 0]] == 0.5*FT,
    Cm[t, Infinity] == Cm0,
    Cs[t, Infinity] == Cs0}
   {Cm[t, x], Cs[t, x]}, {t, 0, 1000}, {x, 0, Infinity}];
plot3D[Cs, {t, 0, 1000}, {x, 0, 10000}]

Dm = 9 e - 8;
Ds = 5 e - 9;
Cm0 = 1.276 e + 15;
Cs0 = 1.276 e + 20;
Ka = 1;
Kg = 1 e - 5;
FT = 1 e + 11;

所以,基本上,我们有两个偏微分方程、2 个初始条件和 4 个边界条件(两个常数 B.C. 两个通量 B.C.)。我们知道参数的所有值。我不确定它是格式问题还是边界选择问题。系统给出

"Thread::tdlen: 中长度不等的对象" "NDSolve::argmu: NDSolve 使用 1 个参数调用;需要 3 个或更多参数。"

有人可以提供一些有价值的建议吗?

谢谢


更新

Dm = 9*10^-8;
Ds = 5*10^-9;
Cm0 = 1.276*10^+15;
Cs0 = 1.276*10^+20;
Ka = 1;
Kg = 1*10^-5;
FT = 1*10^+11;
NDSolve[{D[Cm[t, x], t] == 
    Dm*D[Cm[t, x], x, x] + Kg*Cs[t, x] - Ka*Cm[t, x],
   D[Cs[t, x], t] == Ds*D[Cs[t, x], x, x] + Ka*Cm[t, x] - Kg*Cs[t, x],
   Cm[0, x] == Cm0,
   Cs[0, x] == Cs0,
   Dm*(D[Cm[t, x], x] /. x -> 0) == 0.7*FT,
   Ds*(D[Cs[t, x], x] /. x -> 0) == 0.3*FT,
   Cs[t, 10000] == Cs0,
   Cm[t, 10000] == Cm0},
  {Cm[t, x], Cs[t, x]}, {t, 0, 1000}, {x, 0, 10001}, 
  PrecisionGoal -> 2];
Animate[Plot[Cs[t, x], {x, 0, 10000}, 
  PlotRange -> {{0, 1000}, {0, 5*10^20}}], {t, 0, 1000}]

【问题讨论】:

    标签: wolfram-mathematica pde


    【解决方案1】:

    “不相等”错误是因为您在第 8 行和第 9 行的 } 和 { 之间缺少逗号。

    但这不是您唯一的问题。这解决了其他一些问题,但不是所有问题。

    Dm = 9*10^-8;
    Ds = 5 *10^-9;
    Cm0 = 1.276*10^+15;
    Cs0 = 1.276*10^+20;
    Ka = 1;
    Kg = 1*10^-5;
    FT = 1*10^+11;
    NDSolve[{D[Cm[t, x], t] == Dm*D[Cm[t, x], x, x] + Kg*Cs[t, x] - Ka*Cm[t, x], 
    D[Cs[t, x], t] == Ds*D[Cs[t, x], x, x] + Ka*Cm[t, x] - Kg*Cs[t, x],
    Cm[0, x] == Cm0, Cs[0, x] == Cs0, Dm*ND[Cm[t, 0]] == 0.5*FT, 
    Ds*ND[Cs[t, 0]] == 0.5*FT, Cm[t, Infinity] == Cm0, 
    Cs[t, Infinity] == Cs0}, {Cm[t, x], Cs[t, x]}, {t, 0, 1000}, {x, 0, Infinity}];
    plot3D[Cs, {t, 0, 1000}, {x, 0, 10000}]
    

    在启动 NDSolve 之前,必须将 NDSolve 中的所有内容(除了您正在求解的函数和自变量)初始化为数值,因此我将您的分配向上移动。 Mathematica 有自己的写指数的方式。

    现在解决更大的问题。 您有一个尚未定义的 ND 函数。这必须在 NDSolve 开始之前定义。 对于您的 x 变量,NDSolve 与 Infinity 限制的合作有可能,甚至有可能。它可能有效,但我不会打赌。你可以尝试一个更小的有限值,也许是 10^4,因为它比你的 10^3 大,看看如果 Infinity 不行,这是否可行。

    目前我没有发现任何其他大问题,但是在不知道您的 ND 功能是什么的情况下,我无法开始对此进行测试,并且可能会清除下一层或两三个要查找的问题。

    但如果这是您第一次尝试 Mathematica,这实际上是相当不错的。

    【讨论】:

    • 嗨,比尔,感谢您的评论。
    • 我打算使用 ND 作为函数对 x 的一阶导数。使用代码中的示例,我想表达 x=0,Ds*(dCm/dx)=0.5*FT。那么,mathematica 中如何定义一阶导数呢?
    • 也许这就是你想要完成的。 Ds*(D[Cm[t, x], x] /. x -> 0) == 0.5*FT
    • 我更新了上面的代码,试了一会儿。它不断给出“NDSolve::bcedge: 边界条件 Cs[t,10000]==1.276*10^20 未在计算域边界的单个边上指定。”
    猜你喜欢
    • 1970-01-01
    • 2014-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多