在过去的几天里,我一直在与Mathematica的Manipulate功能进行斗争。
我正在努力调整进入物理模型的假设和边界条件。为此,我希望能够绘制不同的方程并调整参数并使图表在运行中更新。 Manipulate似乎是工作的完美工具 - 除了我无法让它工作。参数更改后,图表不会更新。
基本示例:
a =.;
b =.;
c =.;
func1[x_] := a*x;
func2[x_] := a*x^2 + b*x + c;
funcNamesList := {"Linear", "Quadratic"};
funcList := {func1[x], func2[x]}
Manipulate[
Plot[function, {x, -5, 5}], {function,MapThread[Function[#1 -> #2],
{funcList, funcNamesList}]}, {a, -5, 5}, {b, -5, 5}, {c, -5, 5},
LocalizeVariables -> False
]
我可以通过点击func1
,调整func1
,然后再次点击a
来刷新func1
,但我希望能够拥有它我调整a
时会更新,因为我使用的实际函数在参数方面相当不稳定。
- 因为我将处理具有不同参数的长函数,所以使用函数列表很有用。
修改
如果它为任何人提出任何想法,这里有一些我想要做的个别组件的工作示例(来自Wolfram文档):
绘制图表并在参数更改时更新它们:
Manipulate[
Plot[Sin[a x + b], {x, 0, 6}], {{a, 2, "Multiplier"}, 1, 4},
{{b, 0, "Phase Parameter"}, 0, 10}
]
注意:当函数被带到外面时会中断:
func[x] := Sin[a x + b];
Manipulate[
Plot[func[x], {x, 0, 6}], {{a, 2, "Multiplier"}, 1, 4},
{{b, 0, "Phase Parameter"}, 0, 10}, LocalizeVariables -> False
]
更改正在绘制的函数的示例:
Manipulate[
Plot[f[x], {x, 0, 2 Pi}], {f, {Sin -> "sine", Cos -> "cosine", Tan -> "tangent"}}
]
编辑2
将func2从a*x^2
更改为a*x^2 + b*x + c
,以反映函数可能具有不同参数的事实。
编辑3 添加了我用来在功能按钮上获得好名字的花絮。
答案 0 :(得分:7)
有两个问题导致您的Manipulate
声明失效。
首先,Manipulate
变量a
由于LocalizeVariables -> False
设置而属于全局,而Plot
变量x
则不是。 x
是Plot
表达式的本地。
第二个问题是默认情况下Manipulate
会假定为TrackedSymbols -> Full
。这意味着仅跟踪显式出现在受操纵表达式中的符号。请注意,a
不会出现在表达式中,因此不会对其进行跟踪。
我们可以纠正这两个问题:
a =.;
function =.;
func1[x_] := a*x;
func2[x_] := a*x^2;
funcList := {func1, func2}
Manipulate[
Plot[function[x], {x, -5, 5}], {function, funcList}, {a, -5, 5},
LocalizeVariables -> False, TrackedSymbols :> {a, function}
]
变化是:
funcList
已更改为{func1, func2}
Plot
表达式已更改为function[x]
,从而引用了本地x
变量。Manipulate
选项TrackedSymbols :> {a, function}
。function
最初未设置。答案 1 :(得分:2)
我的方式略有不同:
func1[x_, a_] := a*x;
func2[x_, a_] := a*x^2;
funcList = {func1, func2};
Manipulate[
Plot[Evaluate[function[x, b]],
{x, -5, 5},
PlotLabel \[Rule] funcList
],
{function, funcList},
{b, -5, 5}
]
但这可能不适合你想要的东西。你的功能有不同的签名吗?
编辑:我已将参数重命名为b
以使其更清晰,因为它只是传递的参数,而不是您使用它时的全局变量。