用mathematica求解具有边界条件的连续性方程(偏微分方程),要可执行的代码

 我来答
xzcyr
2016-12-03 · TA获得超过3400个赞
知道大有可为答主
回答量:1400
采纳率:100%
帮助的人:670万
展开全部

……上面那个答案明明什么都没说,为什么你采纳了啊?


算了不管了,总之这里是我的答案。这个问题的关键在于DiracDelta的处理。DiracDelta可以做近似处理,比如说使用:

eq = With[{n = n[t, x]}, D[n, t] == D[n, x, x]];

bc = {n[t, 0] == 0, D[n[t, x], x] == 0 /. x -> 1};

dirac[r_, a_] := Sqrt[a/Pi] Exp[-a r^2]

ic = n[0, x] == 2 n0 dirac[x - 1, 100];(*注意这个 2 是必要的,因为你的DiracDelta设在了端点上*)

nsol = NDSolveValue[{eq, ic, bc} /. n0 -> 1, n, {t, 0, 1/10}, {x, 0, 1}];

np = Plot3D[nsol[t, x], {t, 0, 1/10}, {x, 0, 1}, PlotRange -> All, PlotStyle -> Red];

效果就已经不错了。


不过,对于你这个问题,还存在更准确的处理方法,因为它的解析解是可求的,只要用上LaplaceTransform:


    eq = With[{n = n[t, x]}, D[n, t] == D[n, x, x]];

    bc = {n[t, 0] == 0, D[n[t, x], x] == 0 /. x -> 1};

    ic = n[0, x] == n0 DiracDelta[x - 1];

    

    teqn = 

     LaplaceTransform[{eq, bc}, t, s] /. Rule @@ ic /. 

       HoldPattern@LaplaceTransform[a_, __] :> a /. n -> (n@#2 &)

    (* {-n0 DiracDelta[-1 + x] + s n[x] == (n^′′)[x], {n[0] == 0, 

      Derivative[1][n][1] == 0}} *)

    

    tsol = n[x] /. First@DSolve[teqn, n[x], x]

    (* (1/(2 (1 + E^(2 Sqrt[s])) Sqrt[s]))E^(-Sqrt[s] - 

      Sqrt[s] x) n0 (-2 E^(2 Sqrt[s]) + 2 E^(2 Sqrt[s] + 2 Sqrt[s] x) + 

       E^(2 Sqrt[s]) HeavisideTheta[-1 + x] + E^(4 Sqrt[s]) HeavisideTheta[-1 + x] - 

       E^(2 Sqrt[s] x) HeavisideTheta[-1 + x] - 

       E^(2 Sqrt[s] + 2 Sqrt[s] x) HeavisideTheta[-1 + x]) *)


tsol 是经过了拉普拉斯变换的这个问题的解析解,最后一步就是倒回去了,不过呢它的符号求解似乎不可能,于是我们如果要数值解的话,就需要数值拉普拉斯反变换。这里我将使用这个程序包:library.wolfram.com/infocenter/MathSource/5026


这里以n0等于1为例:


tsolfunc = Function[{s, x}, #] &[tsol /. n0 -> 1]

(*注意FT要从上面的程序包里调出来。*)

solgenerator[t_] := 

 solgenerator[t] = Module[{x}, Compile[#, #2] & @@ {x, FT[tsolfunc[#, x] &, t]}]

Plot3D[solgenerator[t][x], {t, 0, 1/10}, {x, 0, 1}, PlotRange -> All]

最后,这个帖子里是个类似的问题。其中有一些针对DiracDelta的更详细说明,有兴趣可以读读:http://tieba.baidu.com/p/4126799131

bios8086
2016-08-26 · TA获得超过277个赞
知道小有建树答主
回答量:375
采纳率:0%
帮助的人:145万
展开全部
Please take a look my example. Besides, check your help document before posting your question.
Using D to take derivatives
pde = D[y[x, t], t] + 2 D[y[x, t], x] == 0
Use DSolve to solve the equation and store the solution as soln.
soln = DSolve[pde, y[x, t], {x, t}]
To use the solution as a function, say f[x,t], use /. (the short form of ReplaceAll) and [[...]]
f[x_, t_] = y[x, t] /. soln[[1]]
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式