#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 . >>