Столкнулся с бедой, что NIntegrate и Plot3D работают крайне медленно. Один график строится полдня. Приведу минимальный пример, в котором отображен основной алгоритм расчёта.
Сначала я численно решаю уравнение:
Код:
eqn = j - Sqrt[q^2 + qp^2 - 2*q*qp*Cos[\[Theta]]] -
Sqrt[qp^2 + (1/2)*(16*m5^2 + ma^2 + mp^2 -
Sqrt[(-(16*m5^2) - ma^2 - mp^2)^2 -
4*(ma^2*mp^2 - 16*m5^2*qp^2)])] == 0;
With[{gensol = Solve[eqn, qp]},
Block[{m = 5.5, M = 300, Nc = 3,
c = ScientificForm[-44687.3983417778],
b = ScientificForm[161593.81818181818],
k1 = ScientificForm[16.485010961790245],
k2 = ScientificForm[-13.131344420001051], ma, mp, j},
{j = Sqrt[q^2 + (1/2)*(16*m5^2 + ma^2 + mp^2 +
Sqrt[(-(16*m5^2) - ma^2 - mp^2)^2 -
4*(ma^2*mp^2 - 16*m5^2*q^2)])],
ma = Sqrt[-2*(M^2 - 2*(3*k1 + k2)*
(Sqrt[(c + M^2 + 2*m5^2)/(2*(k1 + k2))] +
m*(b/(2*(c + M^2 + 2*m5^2))))^2 - c +
2*m5^2)], mp = Sqrt[(2*b*m)/
(Sqrt[(c + M^2 + 2*m5^2)/(2*(k1 + k2))] +
m*(b/(2*(c + M^2 + 2*m5^2))))]};
sols = gensol]];
qpC12 = Compile[{{q, _Complex}, {m5, _Complex},
{\[Theta], _Complex}}, Evaluate[qp /. sols[[2]]],
RuntimeOptions -> "EvaluateSymbolically" -> False];
qp32 = Re[qpC12[q, m5, \[Theta]]];
Далее я провожу численное интегрирование:
Код:
qqq[q_?NumericQ, m5_?NumericQ] :=
NIntegrate[(
q^2 qp32^2 Sin[\[Theta]]^2 )/((2 (2 \[Pi])^2) Sqrt[-(2 q Cos[\
\[Theta]] qp32) + qp32^2 + q^2]) , {\[Theta], 0, Pi/2}];
И строю график:
Код:
Plot3D[qqq[q, m5], {q, 0.8, 150}, {m5, 0, 150}]
Данный пример занимает 80 секунд. Читал советы, что ускорить расчёт можно через первообразную, но у меня функция нескольких параметров и я не сильно понимаю как это сделать для неё.
Пробовал так:
Код:
f1[q_, m5_, \[Theta]_] := (q^2 qp32[q,
m5, \[Theta]]^2 Sin[\[Theta]]^2)/((2 (2 \[Pi])^2) Sqrt[-(2 q \
Cos[\[Theta]] qp32[q, m5, \[Theta]]) + qp32[q, m5, \[Theta]]^2 + q^2])
f2sol = ParametricNDSolve[{D[f2[q, m5, \[Theta]], \[Theta]] ==
f1[q, m5, \[Theta]], D[f2[q, m5, \[Theta]], \[Theta]] == 0},
f2, {\[Theta], 0, Pi/2}, {q, m5},
Method -> {"ParametricSensitivity" -> None}]
Plot3D[f2sol[q, m5, \[Theta]], {q, 0.8, 150}, {m5, 0, 150}]
Но такой алгоритм не получилось завести. Для справки, для одной переменной, очень легко завести такой алгоритм. Например, простейший пример:
Код:
f[x_] := Sin[x^2]
iF = NDSolveValue[{F2'[x] == f[x], F2[0] == 0}, F2, {x, 0, 5}]
Plot[iF[x], {x, 0, 5}]
Буду благодарен любым советам и предложениям! Возможно стоит попробовать сделать всё на питоне?