Wolfram Mathematica中的求值函数究竟是如何工作的。下面的两个图有什么不同

Wolfram Mathematica中的求值函数究竟是如何工作的。下面的两个图有什么不同,math,plot,wolfram-mathematica,Math,Plot,Wolfram Mathematica,我试图理解函数是如何精确计算的。这里我有两个例子,它们之间的唯一区别是函数求值 ReliefPlot[ Table[Evaluate[Sum[Sin[RandomReal[9, 2].{x, y}], {20}]], {x, 1, 2, .02}, {y, 1, 2, .02}], ColorFunction -> (Blend[{Darker[Green, .8],

我试图理解函数是如何精确计算的。这里我有两个例子,它们之间的唯一区别是函数求值

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]
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]
第一个绘图与评估

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]
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]
“图1”

第二个情节没有评估

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]
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]
“图2”


请在此解释Evaluate是如何起作用的。

Table
具有
HoldAll
属性

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

阅读并了解WL中有关评估的更多信息。

具有
HoldAll
属性

Attributes[Table]
(* {HoldAll, Protected} *)
阅读并了解WL中有关评估的更多信息。

比较此项

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次迭代,即使您在屏幕上看到51*51个不同颜色的块,也应在20后面显示绘图

如果从每个图中删除ReliefPlot,则在没有图形的情况下,将显示相同的计数,这似乎表明不是ReliefPlot负责计算RandomReal的次数,而是表格

因此,Evaluate将表条目的外部文本转换为内部表单,并告诉表这已经完成,不需要在表的每次迭代中重复

你在屏幕上看到的是Mathematica的前端。隐藏在这后面的是后端,在那里完成了大部分实际计算。前端和后端在输入、计算、输出和显示期间相互通信

但这仍然不能回答为什么这两个情节看起来如此不同的问题。我猜想,如果不使用Evaluate,因此不将表的结果标记为已完成,则浮雕图将重复探测表中的该表达式,并且该表达式将因随机实数而每次都不同,这就是显示更平滑、分辨率更高的图形的原因。但是,如果确实使用了“评估”,因此表被标记为“已完成”和“已完成”,并且不需要进一步评估,则浮雕图只使用51*51的值,而无需重新计算或探测,从而获得较低分辨率的浮雕图

与几乎所有Mathematica一样,数千个不同函数中的每一个函数所使用的算法的详细信息都不可用。有时,特定函数的“帮助”页面中的“选项和详细信息”选项卡可以为您提供一些附加信息。实验有时可以帮助您猜测代码背后发生了什么。有时,其他非常聪明的人也会找出部分行为,并发布描述。但这可能就是全部了。

比较一下这个

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次迭代,即使您在屏幕上看到51*51个不同颜色的块,也应在20后面显示绘图

如果从每个图中删除ReliefPlot,则在没有图形的情况下,将显示相同的计数,这似乎表明不是ReliefPlot负责计算RandomReal的次数,而是表格

因此,Evaluate将表条目的外部文本转换为内部表单,并告诉表这已经完成,不需要在表的每次迭代中重复

你在屏幕上看到的是Mathematica的前端。隐藏在这后面的是后端,在那里完成了大部分实际计算。前端和后端在输入、计算、输出和显示期间相互通信

但这仍然不能回答为什么这两个情节看起来如此不同的问题。我猜想,如果不使用Evaluate,因此不将表的结果标记为已完成,则浮雕图将重复探测表中的该表达式,并且该表达式将因随机实数而每次都不同,这就是显示更平滑、分辨率更高的图形的原因。但是,如果确实使用了“评估”,因此表被标记为“已完成”和“已完成”,并且不需要进一步评估,则浮雕图只使用51*51的值,而无需重新计算或探测,从而获得较低分辨率的浮雕图


与几乎所有Mathematica一样,数千个不同函数中的每一个函数所使用的算法的详细信息都不可用。有时,特定函数的“帮助”页面中的“选项和详细信息”选项卡可以为您提供一些附加信息。实验有时可以帮助您猜测代码背后发生了什么。有时,其他非常聪明的人也会找出部分行为,并发布描述。但这可能就是全部。

我仍然不明白它是如何让结果有所不同的。例如,表[Evaluate[Sin[k*j]],{k,1,4},{j,1,4}]//矩阵变换形式和表[Sin[k*j],{k,1,4},{j,1,4}]//矩阵变换形式给出相同的结果。我仍然不知道它是如何使结果不同的。例如,表[Evaluate[Sin[k*j]]、{k,1,4}、{j,1,4}]//MatrixForm和表[Sin[k*j]、{k,1,4}、{j,1,4}//MatrixForm给出相同的结果。