Mathematica; NDSolve; Могу ли я использовать интерполяционную функцию в качестве начальных условий?

#wolfram-mathematica

#wolfram-mathematica

Вопрос:

Вопросы возникают потому, что я хочу использовать решение одного 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. В принципе, да, вы можете использовать результат одного PDE для решения другого. Я не знаю, как это делается в Mathematica, но если вы намерены это сделать, обычно удается иметь одну и ту же сетку (или, в более общем смысле, одно и то же представление) для обоих PDE, чтобы избежать интерполяции.

2. Александр: Спасибо. Не могли бы вы уточнить, «чтобы иметь одну и ту же сетку (или, в более общем смысле, одно и то же представление) для обоих PDE, чтобы избежать интерполяции»? Вы имеете в виду изменить мое уравнение? Как мне реализовать это в Mathematica?

3. Это связано с этим потоком physicsforums.

4. @user1019155: Я думаю, ваша проблема здесь в том, что у вас недостаточно доступа к базовой числовой схеме. Здесь это нежелательно. Вы бы хотели, чтобы необработанный вывод схемы (а не интерполирующая функция) подключался ко второму решателю. К сожалению, я недостаточно знаю Mathematica, чтобы быть в состоянии вам помочь.

5. @AlexandreC: InterpolationFunction Вывод первого PDE на самом деле желателен в Mathematica. Для данного набора точек сетки в z и t это обеспечивает наилучшее представление.

Ответ №1:

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

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

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

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

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

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