Мне надо выполнить несложный математический код на Wolfram Mathematica. Он рассчитывает матрицу перехода через 2 определённых слоя диэлектрика, а потом эта матрица возводится в 500 степень (500 пар таких слоёв).
T[n_, d_] := {{Cos[2 \[Pi] n*\[CurlyEpsilon]/1240 d],
I/n Sin[2 \[Pi] n*\[CurlyEpsilon]/1240 d]}, {I n Sin[
2 \[Pi] n*\[CurlyEpsilon]/1240 d],
Cos[2 \[Pi] n*\[CurlyEpsilon]/1240 d]}};
\[Epsilon]1 = 4. + I/20;
d1 = 100.;
\[Epsilon]2 = 16. + I/10;
d2 = 50.;
l = 500;(*number of layers*) (*проблемная часть кода*)
T2 = T[Sqrt[\[Epsilon]2], d2].T[Sqrt[\[Epsilon]1], d1];(*проблемная часть кода*)
T3 = MatrixPower[T2, l]; (*проблемная часть кода*)
rl, tl} = {r, t} /. NSolve[T3.{1 + r, 1 - r} == {t, t}, {r, t}][[1]]; (*проблемная часть кода*)
TL2 = Evaluate[Abs[tl]^2];
zoomcoeff = 10.;
pl = Plot[TL2*{1, zoomcoeff}, {\[CurlyEpsilon], 2.84, 2.99},
PlotRange -> {All, {0, 9.7}}, Frame -> True,
FrameLabel -> {Style["E,eV",
FontSize -> 18], {Style["|t|^2", FontSize -> 18]}}]
Однако, где-то на стадии возведения матрицы в 500 степень или при решении уравнения (следующая строчка) он зависает в режиме Running, и процесс убивается только выходом из ядра (Abort Evaluation не работает)
При этом, меньшее число пар слоёв ( 10, 100) программа прекрасно считает. В чём проблема?