Мне нужно получить такое же решение, как представл...
Creato il: 9 settembre 2026
Risposto usando GPT-5.6 Thinking da Chat01
Creato il: 9 settembre 2026
Risposto usando GPT-5.6 Thinking da Chat01
Мне нужно получить такое же решение, как представлено в этой статье. Я решаю систему уравнений (24), (25) и (27) численно в wolfram с граничными условиями (3),(28) и (32) методом стрельбы с параметром стрельбы \phi_S, но почему-то функция shoot выдает FAiled. Проверь, пожалуйста, весь код, найди все ошибки и исправь их. Дальше строчки с функцией scanResidual НЕ СМОТРИ И НЕ ПРОВЕРЯЙ, это черновики, не имеющие отношения к основному коду.
Да. Я проверил основной код до строки ClearAll[scanResidual]; сам scanResidual и всё, что идёт после него, я не анализировал, как вы просили.
Главное: проблема не одна. В коде есть несколько независимых ошибок, и две из них сами по себе достаточны, чтобы shoot возвращал $Failed.
Например, у вас определено примерно так:
wlnuPrimeFun[r_, phi_, phip_, lam_] := ... Exp[lam[r]] phip[r]^2 ...
а вызывается:
wlnuPrimeFun[r, phi[r], F[r], lam[r]]
После подстановки Mathematica фактически получает конструкции вида
wlExp[lam[r][r]] F[r][r]^2 phi[r][r]
То есть аргумент lam_ уже равен значению lam[r], но затем вы второй раз применяете к нему [r].
Эта ошибка была сразу в нескольких местах:
wlAexpr nuPrimeFun lambdaPrimeFun C33 rhsVals
Именно поэтому правая часть системы перестаёт быть численной для NDSolve.
В исправленной версии везде разделены численные аргументы:
wlAexpr[rr_, ph_, pp_, la_] := ... Exp[la] ph pp
а не la[rr], ph[rr], pp[rr].
shoot[0.2] для ваших параметров вообще не должен работать.В статье — это именно параметр стрельбы на горизонте, который подбирается так, чтобы на бесконечности получилось . Авторы прямо это пишут. (2207.03944v2.pdf)
То есть
wlphiS = v
ставить нельзя.
Для ваших параметров
wlell = 3; mu = 0.1; h = 0.5; v = 0.2;
режим как раз соответствует фиолетовой кривой Fig. 3, . (2207.03944v2.pdf)
В этом режиме поле около горизонта почти равно нулю, а не .
Я отдельно подставил ваши исходные значения rS=1.01, ell=3, phiS=0.2 в (30)+(32). Для phiS=0.2 имеем , и уравнение (32) даёт для
Реального вообще нет. Поэтому ваш
wlFindRoot[..., {x, 0.1}]
и выдаёт FindRoot::lstol. Это не проблема начального приближения 0.1: при phiS=0.2 искомого вещественного корня нет.
По независимой численной проверке исправленной системы для параметров Fig. 3 и rmax=50 физический параметр стрельбы находится примерно около
а не около 0.2 и тем более не около 0.87.
phiPrimeS нельзя надёжно определять одним FindRoot[{x,0.1}].Уравнение (32), совместно с (30), является алгебраическим по . В зависимости от оно может иметь:
Причём нужно ещё выбрать физическую ветвь с
В статье именно (30) задаёт , а (32) — граничное условие для производной поля. (2207.03944v2.pdf) (2207.03944v2.pdf)
Я заменил этот FindRoot на NSolve[..., Reals], отбрасываю корни с b1<=0 и выбираю физическую ветвь, непрерывно связанную с приближением
wl24 ell^2 phiS/rS^3 + rS Vp[phiS]
rS = 1.01 неверно, если вы хотите воспроизвести графики статьи.Авторы переходят к безразмерной координате
следовательно, после этого горизонт находится в
(2207.03944v2.pdf)
У вас одновременно стояло
wlrS = 1.01; eps = 0.01;
а затем интегрирование начиналось с
wlrS + eps
то есть фактически с 1.02.
Нужно:
wlrS = 1; eps = 1/100; r0 = rS + eps; (* 1.01 *)
eps и есть отступ от горизонта.
b1 > 0.Было:
wl(* If[bb <= 0, Return[$Failed]]; *)
Но затем используется
wllam[r0] == -Log[bb eps]
Если bb<=0, решение немедленно становится комплексным. Проверку нужно вернуть.
Quiet@Check[..., $Failed] скрывает настоящую причину ошибки.Конструкция
wlQuiet @ Check[ NDSolve[...], $Failed ]
очень неудобна для такого расчёта: Check может превратить вычисление в $Failed при сообщении от NDSolve, а Quiet одновременно скрывает это сообщение.
Поэтому вы видите только $Failed и не видите, что произошло внутри.
Я это убрал: теперь NDSolveValue показывает настоящие диагностические сообщения, а $Failed возвращается только если действительно не получилось получить четыре InterpolatingFunction.
У вас:
wlmu = 0.1; h = 0.5; rS = 1.01;
то есть машинные числа, а параметр стрельбы для рассматриваемого решения порядка . Кроме того, наружная стрельба является очень чувствительной separatrix-задачей: надо подавить растущую асимптотическую моду.
И сам Mathematica у вас сообщает:
textYou may need more than MachinePrecision digits ...
Я перевёл параметры в точные числа:
wlmu = 1/10; v = 1/5; h = mu/v;
и использовал
wlWorkingPrecision -> 50 AccuracyGoal -> 28 PrecisionGoal -> 22
findPhiS у вас неправильное уравнение.Вы определяете
wlresidual[phiS] = phi[rmax] - v
но затем ищете
wlresidual[phiS] == 0.1
Для условия (3)
должно быть строго
wlresidual[phiS] == 0
Условие дано в статье в (3), а метод стрельбы именно подбирает , чтобы его выполнить. (2207.03944v2.pdf) (2207.03944v2.pdf)
Кроме того, стартовать FindRoot с
wlphi0 = 0.0
для этой задачи неудобно. Для ваших параметров корень порядка , поэтому я использовал две стартовые точки:
wl{x, 6*10^-9, 7*10^-9}
Plot до scanResidual.Вот это неверно:
wlPlot[nu /. shoot[0.87], ...]
Во-первых, надо вычислять nu[rr], а не символ nu. Во-вторых, 0.87 совершенно не является физическим phiS для набора v=0.2.
И это:
wlPlot[lam[rr] /. shoot, ...]
тоже неверно: shoot — функция, а не список правил. Именно поэтому Mathematica пишет:
text{shoot} is neither a list of replacement rules ...
В исправленной версии сначала вычисляется
wlsol = shoot[phiSsol];
а затем используются непосредственно InterpolatingFunction:
wlphiIF = sol[[1]]; nuIF = sol[[3]]; lamIF = sol[[4]];
Граничное условие горизонта фиксирует
но константа связана с произвольной нормировкой времени. В статье условие (28) задаёт только исчезновение и на горизонте. (2207.03944v2.pdf)
Поэтому выбор
wlnu[r0] == Log[eps]
допустим для интегрирования, но перед сравнением с Fig. 4 надо сделать постоянный сдвиг , чтобы метрика была асимптотически Минковской.
Я добавил:
wlnuShift = -(nuIF[rmax] + lamIF[rmax]); enu[r_] := Exp[nuIF[r] + nuShift];
Знаки и коэффициенты в вашей реализации (24) и (25) после решения относительно lambda' и nu' у вас в основном были правильными. Аналогично разложение (26),(27) в rhsVals по и математически сделано правильно — там основная ошибка была именно в передаче значений как функций.
И использование (26) здесь не противоречит вашему желанию решать (24),(25),(27): авторы отмечают, что из четырёх уравнений независимы только три из-за тождеств Бианки. (2207.03944v2.pdf) Уравнение (26) можно использовать алгебраически для исключения из (27).
Я собрал чистую версию всего основного расчёта: потенциал, (30), (32), правильные (24),(25), исключение вторых производных, shoot, residual, findPhiS и построение трёх графиков. scanResidual туда намеренно не включал.
[Скачать исправленный Wolfram Language код]
Для вашего набора контрольные значения после исправления должны быть примерно такими:
textphiS ~ 6.4*10^-9 phi[50] ~ 0.2 phi[12]/v ~ 0.95
Последнее хорошо соответствует фиолетовой кривой Fig. 3: в статье для неё как раз указано . (2207.03944v2.pdf)
Самая важная последовательность проверки сейчас такая: сначала выполните файл целиком, затем отдельно посмотрите phiPrimeS[0.2] — он корректно должен сообщить, что физической вещественной ветви нет; после этого phiSsol = findPhiS[] должен найти малое значение порядка , и уже shoot[phiSsol] должен дать InterpolatingFunction, а не $Failed.