Я пытаюсь понять, как именно работает функция Evaluate. Здесь у меня есть два примера, и единственная разница между ними заключается в функции Evaluate.
Первый сюжет с Evaluate.
ReliefPlot[
Table[Evaluate[Sum[Sin[RandomReal[9, 2].{x, y}], {20}]], {x, 1, 2, .02},
{y, 1, 2, .02}],
ColorFunction ->
(Blend[{Darker[Green, .8], Lighter[Brown, .2],White}, #] &),
Frame -> False, Background -> None, PlotLegends -> Automatic]
https://imgur.com/itBRYEv.png "участок 1"
Второй сюжет без оценки.
ReliefPlot[
Table[Sum[Sin[RandomReal[9, 2].{x, y}], {20}], {x, 1, 2, .02},
{y, 1,2, .02}],
ColorFunction ->
(Blend[{Darker[Green, .8], Lighter[Brown, .2], White}, #] &),
Frame -> False, Background -> None,
PlotLegends -> Automatic]
https://i.imgur.com/fvdiSCm.png "участок 2"
Пожалуйста, объясните, какое значение здесь имеет Evaluation.
Сравните это
count=0;
ReliefPlot[Table[Sum[Sin[count++;RandomReal[9,2].{x,y}],{20}],{x,1,2,.02},{y,1,2,.02}]]
count
который должен отображать ваш график, за которым следует 52020 = 51 * 51 * 20, потому что у вас есть таблица 51 * 51, и каждая запись должна оценивать 20 итераций вашей суммы.
с этим
count=0;
ReliefPlot[Table[Evaluate[Sum[Sin[count++;RandomReal[9,2].{x,y}],{20}]],{x,1,2,.02},{y,1,2,.02}]]
count
который должен отображать ваш график, за которым следует 20, потому что Evaluate нужно было выполнить 20 итераций вашей суммы только один раз, даже если вы видите на экране 51 * 51 блоков разных цветов.
Вы получите те же отображаемые подсчеты без графики, если вы удалите ReliefPlot из каждого из них, так что, похоже, это показывает, что не ReliefPlot отвечает за количество вычислений вашего RandomReal, это Таблица .
Таким образом, Evaluate переводит внешний текст вашей записи в таблицу во внутреннюю форму и сообщает таблице, что это уже было сделано и не нужно повторять для каждой итерации таблицы.
То, что вы ставите и видите на экране, является интерфейсом Mathematica. За этим скрывается серверная часть, где выполняется большая часть фактических вычислений. Передняя и задняя части взаимодействуют друг с другом во время ввода, вычислений, вывода и отображения.
Но это все еще не отвечает на вопрос, почему два сюжета выглядят так по-разному. Я предполагаю, что когда вы не используете Evaluate и, таким образом, не отмечаете результат таблицы как завершенный и законченный, тогда ReliefPlot будет неоднократно проверять это выражение в вашей таблице, и это выражение будет каждый раз другим из-за RandomReal и это то, что отображает более плавную отображаемую графику с более высоким разрешением. Но когда вы используете Evaluate и, таким образом, таблица помечается как завершенная и не требует дальнейшей оценки, тогда ReliefPlot просто использует значения 51 * 51 без пересчета или проверки, и вы получаете ReliefPlot с более низким разрешением.
Как и почти во всей системе Mathematica, детали алгоритмов, используемых для каждой из тысяч различных функций, недоступны. Иногда вкладка «Параметры и сведения» на странице справки для данной функции может предоставить вам дополнительную информацию. Иногда экспериментирование может помочь вам угадать, что скрывается за кодом. Иногда другие очень умные люди выясняли части поведения и публиковали описания. Но это, наверное, все, что есть.
Я до сих пор не понимаю, как это меняет результат. Например, Table[Evaluate[Sin[k * j]], {k, 1, 4}, {j, 1, 4}] // MatrixForm и Table[Sin[k * j], {k, 1, 4} , {j, 1, 4}] // MatrixForm дает тот же результат.