Честно говоря, так и не понял вашей реализации - наверно и потому, что вы не так поняли что мне надо)
Код:
amax := 50
i := 1
FunctionFind[mm_, a_] :=
If[a < mm - 1 , FindE[mm, a, 0],
If[a == mm - 1, FindE[mm, a + 1, 0], 0]];
z = ParallelTable [FunctionFind[mm, a], {mm, 2, amax}, {a, 1, amax}]
While[i < amax, z[[i, i + 1]] = z[[i, i]]; i++]
MatrixForm[z]
Вот так я сделал. Считает долго, да. Думал, потому что это из-за неэффективность FindE - она работает перебором значений на диапазоне от А до Б (расчет лишних значений я отсек в условиях функции FunctionFind). Поскольку значения величин в матрице с лева на право возрастают, улучшил и ввел поиск не от А, а от предыдущего значения Б. dE здесь точность, шаг перебора.
Код:
amax := 50
i := 1
FunctionFind[mm_, a_] :=
If[a < mm - 1 , FindE[mm, a, If[a < 1, z[[mm, a - 1]], Ed[a] - dE]],
If[a == mm - 1,
FindE[mm, a + 1, If[a < 1, z[[mm, a - 1]], Ed[a] - dE]], 0]];
z = ParallelTable [FunctionFind[mm, a], {mm, 2, amax}, {a, 1, amax}]
While[i < amax, z[[i, i + 1]] = z[[i, i]]; i++]
MatrixForm[z]
Экономия - буквально в пределах погрешности, значит как-то не так я понимаю принцип работы интерпретатора.
Наверное, он не обращается в ходе вычисления z[mm,a] к уже посчитанному z[mm, a-1], а выстраивает всю цепочку заново, весь z ещё не заполнен до конца. Правильно ли я понимаю? Как можно исправить? Наверное Table реализован внутри как обычный цикл, поэтому и медленно.