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

Ben*_*enB 6 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
]
Run Code Online (Sandbox Code Playgroud)

例如,我可以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}
]
Run Code Online (Sandbox Code Playgroud)

注意:当函数被带到外面时会中断:

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
]
Run Code Online (Sandbox Code Playgroud)

更改正在绘制的函数的示例:

Manipulate[
   Plot[f[x], {x, 0, 2 Pi}], {f, {Sin -> "sine", Cos -> "cosine", Tan -> "tangent"}}
]
Run Code Online (Sandbox Code Playgroud)

编辑2 更改了func2 a*x^2,a*x^2 + b*x + c以反映函数可能具有不同参数的事实.

编辑3添加了我用来在功能按钮上获得好名字的花絮.

WRe*_*ach 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}
 ]
Run Code Online (Sandbox Code Playgroud)

变化是:

  1. funcList 被改为 {func1, func2}
  2. Plot表达被改变到function[x],由此引用本地x变量.
  3. Manipulate选项TrackedSymbols :> {a, function}已添加.
  4. function 最初未设置.