数学; NDSolve;我可以使用InterpolatingFunction作为初始条件吗?

时间:2011-10-28 22:00:49

标签: wolfram-mathematica

出现问题是因为我想使用一个PDE的解决方案作为解决另一个PDE的初始条件。因为在NDSolve中,解决方案是由InterpolatingFunction给出的,我必须在第二个PDE中使用InterpolatingFunction。这可能吗?为什么我的电脑永远运行它? 我的代码:

(*********************Parameters********************)
\[Gamma] = 10^(-5); 
T = 500; 
tm = -250; 
\[Sigma] = 100; 
L = 1; 
L0 = -(L/2); 
L1 = L0 + L; 
c = 29.979; 
\[Omega] = 1.32949/10^8; 
\[Eta] = 1539.1; 
\[Mu] = 6.27; 
\[Beta] = 0.1334; 
k = 40895.3; 

(*********************1st PDE********************)
solS = NDSolve[{D[sS[z, t], t] == (-(\[Gamma] + I*\[Beta]*z))*sS[z, t]-I*\[Omega]*aS[z, t], 
D[aS[z, t], z] + (1/c)*D[aS[z, t], t] == (-I)*\[Eta]*k*sS[z, t], sS[z, -T] == 0, 
aS[z, -T] == E^(-((-T - tm)^2/(2*\[Sigma]^2))), 
aS[L0, t] == E^(-((t - tm)^2/(2*\[Sigma]^2)))}, {sS, aS}, {z, L0, L1}, {t, -T, 0}, 
MaxSteps -> Infinity]

(*************take the result and plot**************)
iniR = solS[[1]][[1]][[2]]
Plot3D[Re[iniR[z, t]], {z, L0, L1}, {t, -T, 0}, PlotRange -> All]

(***********2nd PDE, with the 1st result as ini. con.***********)
solR = NDSolve[{D[sR[z, t], t] == (-(\[Gamma] - I*\[Beta]*z))*sR[z, t] - I*\[Omega]*aR[z, t], 
D[aR[z, t], z] + (1/c)*D[aR[z, t], t] == (-I)*\[Eta]*k*sR[z, t], 
sR[z, 0] == iniR[z, 0], aR[z, 0] == 0, aR[L0, t] == 0}, {sR, aR}, {z, L0, L1}, 
{t, 0, T}, MaxSteps -> Infinity]

1 个答案:

答案 0 :(得分:0)

首先关闭:是的,您可以使用插值功能。这没什么不对。对于Mathematica,InterpolatingFunction仅在该组点上应用插值多项式以产生中间点。实际上,生成的InterpolatingFunction是您可以使用的最准确的表示形式。

您的计算“永远”的原因是您将MaxSteps设置为无穷大。

这不是使用插值函数的问题。更正是您正在进行的模拟在数值上是敏感的问题。通过指定MaxSteps->Infinity,您告诉Mathematica需要花费尽可能多的时间来制作解决方案。

在这样做的过程中,它可能会将步长减小到非常小的程度,比如说10 ^ -6,只是为了获得数值稳定的结果。它只是因为MaxSteps->Infinity设置而这样做。如果你删除它,它实际上可以产生一个解决方案,但它会警告你解决方案很差。

你甚至从Mathematica那里得到一个错误,抱怨解决方案不好:

  

NDSolve :: eerr:警告:缩放的局部空间误差估计值   559.4348244417077 at t = 3.808844111947534在自变量z的方向上远大于规定的误差   公差。 25点的网格间距可能太大而无法实现   期望的准确度或精度。可能已经形成了一个奇点或者你   可能希望使用MaxStepSize或指定较小的网格间距   MinPoints方法选项。 >>