Как именно работает функция оценки в Wolfram Mathematica. Как это влияет на два графика ниже

#math #plot #wolfram-mathematica

#математика #график #wolfram-mathematica

Вопрос:

Я пытаюсь понять, как именно работает функция 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}, #] amp;), 
  Frame -> False, Background -> None, PlotLegends -> Automatic]
  

https://imgur.com/itBRYEv.png «plot1»

Второй график без оценки.

 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}, #] amp;),
 Frame -> False, Background -> None, 
 PlotLegends -> Automatic]
  

https://i.imgur.com/fvdiSCm.png «plot2»

Пожалуйста, объясните, как Evaluate имеет значение здесь.

Ответ №1:

Сравните это

 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, потому что для вычисления вашей суммы необходимо выполнить 20 итераций только один раз, даже если вы видите блоки 51 * 51 разных цветов на экране.

Вы получите одинаковые значения, без графики, если вы удалите ReliefPlot из каждого из них, так что, похоже, это показывает, что не ReliefPlot отвечает за количество вычислений вашего RandomReal, а таблица.

Таким образом, Evaluate переводит внешний текст вашей записи в таблице во внутреннюю форму и сообщает таблице, что это уже было сделано и не нужно повторять для каждой итерации таблицы.

То, что вы размещаете и видите на экране, является интерфейсом Mathematica. За этим скрывается серверная часть, где выполняется большинство фактических вычислений. Передний и задний концы взаимодействуют друг с другом во время вашего ввода, вычислений, вывода и отображения.

Но это все еще не отвечает на вопрос, почему два графика выглядят так по-разному. Я предполагаю, что когда вы не используете Evaluate и, следовательно, не помечаете результат таблицы как завершенный, ReliefPlot будет повторно проверять это выражение в вашей таблице, и это выражение будет отличаться каждый раз из-за RandomReal, и это то, что отображает более плавную графику с более высоким разрешением. Но когда вы используете Evaluate и, следовательно, таблица помечена как выполненная и не нуждается в дальнейшей оценке, тогда график рельефа просто использует значения 51 * 51 без пересчета или проверки, и вы получаете график рельефа с более низким разрешением.

Как и почти во всех Mathematica, подробности алгоритмов, используемых для каждой из тысяч различных функций, недоступны. Иногда вкладка Параметры и сведения на странице справки для данной функции может предоставить вам некоторую дополнительную информацию. Экспериментирование иногда может помочь вам угадать, что происходит за кодом. Иногда другие очень умные люди выясняли части поведения и публиковали описания. Но это, вероятно, все, что есть.

Ответ №2:

Table имеет HoldAll атрибут

 Attributes[Table]
(* {HoldAll, Protected} *)
  

Прочтите это и это, чтобы узнать больше об оценке в WL.

Комментарии:

1. Я все еще не понимаю, как это влияет на результат. Например, таблица[Evaluate[Sin[k * j]], {k, 1, 4}, {j, 1, 4}] // MatrixForm и таблица [Sin[k * j], {k, 1, 4}, {j, 1, 4}] // MatrixForm дают тот же результат.