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添加了我用来在功能按钮上获得好名字的花絮.
有两个问题会阻止您的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}
]
Run Code Online (Sandbox Code Playgroud)
变化是:
funcList 被改为 {func1, func2}Plot表达被改变到function[x],由此引用本地x变量.Manipulate选项TrackedSymbols :> {a, function}已添加.function 最初未设置.