Mathematica;NDSolve;Могу ли я использовать InterpolatingFunction в качестве начальных условий? - PullRequest
3 голосов
/ 29 октября 2011

Вопросы возникают потому, что я хочу использовать решение одного PDE в качестве начального условия для решения другого. Так как в NDSolve решение дается InterpolatingFunction, я должен использовать InterpolatingFunction во втором PDE. Это возможно? Почему мой компьютер работает вечно? Мой код:

(*********************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 голосов
/ 08 декабря 2011

Прежде всего: Да, вы можете использовать функции интерполяции. В этом нет ничего плохого. Для Mathematica InterpolatingFunction просто имеет интерполяционный многочлен, применяемый к множеству точек для получения промежуточных точек. На самом деле, InterpolatingFunction является наиболее точным представлением, которое вы можете использовать.

Причина, по которой ваши вычисления принимают «навсегда», заключается в том, что вы устанавливаете MaxSteps в бесконечность.

Это не проблема использования интерполяционной функции. Это скорее проблема того, что симуляция, которую вы выполняете, чувствительна к числу. Указывая MaxSteps->Infinity, вы говорите Mathematica, что требуется столько времени, сколько нужно для создания решения.

В процессе этого, вероятно, уменьшается размер шага до чего-то нелепо крошечного, скажем, 10 ^ -6, просто чтобы получить численно стабильные результаты. Это происходит только из-за настройки MaxSteps->Infinity. Если вы удалите это, оно может действительно привести к решению, но предупредит вас, что решение плохое.

Вы даже получаете сообщение от Mathematica с жалобой, что решение будет плохим:

NDSolve :: eerr: Предупреждение: масштабированная оценка локальной пространственной ошибки 559,4348244417077 at t = 3.808844111947534 в направлении независимой переменной z намного больше, чем предписанная ошибка толерантность. Шаг сетки с 25 точками может быть слишком большим для достижения желаемая точность или точность. Сингулярность может сформироваться или вы может потребоваться указать меньший интервал сетки, используя MaxStepSize или Параметры метода MinPoints. >>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...