Я хочу решить систему уравнений (24), (25) и (27) ...
作成日: 2026年6月10日
使用モデル GPT-5.5 Thinking by Chat01
作成日: 2026年6月10日
使用モデル GPT-5.5 Thinking by Chat01
Я хочу решить систему уравнений (24), (25) и (27) с граничными условиями (3), (28) и (32) методом стрельбы с параметром стрельбы phi_s, но мой код в wolfram выдает ошибки. Укажи, где ошибки, и исправь код
Я нашёл основные причины ошибок в твоём .nb. Я не запускал Mathematica-ядро здесь, но проверил notebook как текст и сверил формулы с PDF.
Главные ошибки:
Неверно записано уравнение (27).
В квадратной скобке уравнения (27) должно быть сложение:
а в твоём коде второй член фактически умножается на первый. Именно здесь ломается phiDDSymbolic. Уравнения (24), (25), (27) приведены в статье в секции 4. (2207.03944v2.pdf)
Неправильное начальное условие для lam около горизонта.
Из разложения
следует:
wolframlam[rS + eps] == -Log[bb eps]
а не -Log[eps]. Формула для b1 дана в (30), а разложение у горизонта — в (29). (2207.03944v2.pdf)
Нужно стартовать не ровно с phiS, а с разложения:
wolframphi[rS + eps] == phiS + dphiS eps
Это соответствует разложению поля у горизонта в (29). (2207.03944v2.pdf)
FindRoot::nlnum возникает потому, что NDSolve при сбое возвращает не численное решение.
Поэтому residual[phiS] иногда становится не числом. Нужно использовать NDSolveValue + Check, а при сбое возвращать большое численное значение.
Параметры в твоём коде, вероятно, физически плохие:
ell = 10, mu = 1, h = 1, значит v = 1. Для больших ell и mu в статье есть ограничение порядка
иначе регулярного решения может не быть. Для твоих параметров правая часть равна 0.04, а v = 1, поэтому интегратор закономерно упирается в сингулярность. Это не только ошибка кода, а ещё и отсутствие регулярного решения для такого набора параметров. (2207.03944v2.pdf)
Я подготовил исправленный Wolfram-скрипт здесь:
Ключевое исправление для eq27 выглядит так:
wolframeq27 = phidd + (((nuPrimeExpr - lambdaPrimeExpr)/2) + 2/r) psi[r] + (8 ell^2 phi[r]/r^2) ((1 - Exp[-lam[r]]) (nuDoublePrimeExpr + ((nuPrimeExpr - lambdaPrimeExpr)/2) nuPrimeExpr) + Exp[-lam[r]] nuPrimeExpr lambdaPrimeExpr) - Exp[lam[r]] Vp[phi[r]];
А ключевое исправление в начальных условиях для стрельбы:
wolframphi[r0] == phis + psis eps, psi[r0] == psis, nu[r0] == Log[eps], lam[r0] == -Log[bb eps]
В файле я также заменил NDSolve на NDSolveValue, добавил защиту от нечисленных значений в residual и сделал v независимым параметром, после чего ставится h = mu/v.