更新操作[]'d参数更改时的绘图

时间:2011-08-19 19:35:13

标签: wolfram-mathematica

在过去的几天里,我一直在与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 添加了我用来在功能按钮上获得好名字的花絮。

2 个答案:

答案 0 :(得分:7)

有两个问题导致您的Manipulate声明失效。

首先,Manipulate变量a由于LocalizeVariables -> False设置而属于全局,而Plot变量x则不是。 xPlot表达式的本地。

第二个问题是默认情况下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}
 ]

变化是:

  1. funcList已更改为{func1, func2}
  2. Plot表达式已更改为function[x],从而引用了本地x变量。
  3. 添加了Manipulate选项TrackedSymbols :> {a, function}
  4. 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以使其更清晰,因为它只是传递的参数,而不是您使用它时的全局变量。