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给出相同的结果。