我有两个不同的Mathematica笔记本,具有相似但不同的功能。当它们是唯一的笔记本打开时,两者都可以正常工作。尽管我(自由)使用Clear []清除相关变量,但其中一个笔记本打开时始终失败。
称之为 GlobalManipulate
ClearAll["Global`*"]
Clear["Global`*"]
Definition[linear]
linear[x_] := a x;
quad[x_] := a x^2;
functionList := {linear, quad};
Manipulate[
Plot[function[dummy], {dummy, -10, 10}],
{function, functionList}, {a, -10, 10},
LocalizeVariables -> False, TrackedSymbols -> All
]
请拨打此电话,例如 LocalManipulate
Clear["Global`*"];
Manipulate[
{
linear := a x; quad := a x^2;
linear, quad, function,
Plot[ReleaseHold@function, {x, -10, 10}]
},
{function, {HoldForm@linear, HoldForm@quad}},
{a, -10, 10}, TrackedSymbols -> All
]
当它自己运行时,GlobalManipulate按预期工作,我看到更新为a
时更改的图。线性的定义产生Null
。
当LocalManipulate打开,运行时,GlobalManipulate不再有效。 即使它重新运行它的情节会出现一秒钟然后消失。
我使用Mathematica 8的本地副本和Mathematica 7的远程副本重现了这一点。
问题必须涉及函数linear[x_]
和quad[x_]
,因为
GlobalManipulatePrime :
ClearAll["Global`*"]
Clear["Global`*"]
Definition[linear]
linear1[x_] := a x;
quad1[x_] := a x^2;
functionList := {linear1, quad1};
Manipulate[
Plot[function[dummy], {dummy, -10, 10}],
{function, functionList}, {a, -10, 10},
LocalizeVariables -> False, TrackedSymbols -> All
]
工作正常。
编辑添加粗体文字以强调我正在重新运行Global,并且我试图弄清楚尽管我的ClearAll []仍然存在函数的原因。
答案 0 :(得分:5)
在 LocalManipulate 中,您有定义
linear := a x; quad := a x^2
。
由于这些未在Manipulate
命令的控制器部分中声明,因此它们未本地化,因此会覆盖全局变量并破坏 GlobalManipulate 。
在Manipulate
中本地化变量的最简单方法是使用控制器类型None
添加它们。下面我修改了您的 LocalManipulate 代码,以便最后一行使linear
和quad
在特定Manipulate
(DynamicModule
)< / p>
Manipulate[{linear := a x; quad := a x^2; linear, quad, function,
Plot[ReleaseHold@function, {x, -10, 10}]},
{function, {HoldForm@linear, HoldForm@quad}}, {a, -10, 10},
{linear, None}, {quad, None}, TrackedSymbols -> All]
答案 1 :(得分:4)
除了将函数包装在Module
或DynamicModule
中并本地化变量之外,您还可以使用Evaluation ► Notebook's Default Context
菜单将笔记本放在单独的上下文中。
您还可以使用函数Begin
设置上下文。这应该在定义函数之前完成。
更新
我认为我没有太好地阅读你的问题。至于ClearAll的原因不起作用:
linear:=FE`a$$51 x
linear
中定义了符号FE`a$$51 x
,因此GlobalManipulate中的行functionList := {linear, quad};
实际上实际上意味着functionList := {FE`a$$51 x,FE`a$$53 x^2}
,其他Manipulate
上下文中没有什么意思,所以你的情节消失ClearAll
删除此定义?这与埋在LocalManipulate笔记本中可见的Manipulate框中的动态变量的属性有关。他们继续在那里重新定义。删除Manipulate的输出并重新执行GlobalManipulate,你会发现它现在有效。讨论类似的问题here。