在项目的最后几天,我一直在与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, …Run Code Online (Sandbox Code Playgroud) 我有一个简短的程序设置,使用Manipulate显示具有不同参数的三个相同功能的图.我想用参数的值标记每个函数.我的出发点是让一个传奇出现.将PlotLegend添加到绘图会导致Mathematica变得非常慢.
我的代码是:
Needs["PlotLegends`"]
Manipulate[
UemaxOverUe = ((VA/Vphs)^2 (2 p - 1) + 1 - Ves0/Vphs - 2)/((VA/Vphs)^2 - (1 - Ves0/Vphs));
UemaxOverUe2 = ((VA/Vphs)^2 (2 p - 1) + 1 - Ves02/Vphs - 2)/((VA/Vphs)^2 - (1 - Ves02/Vphs));
UemaxOverUe3 = ((VA/Vphs)^2 (2 p - 1) + 1 - Ves03/Vphs - 2)/((VA/Vphs)^2 - (1 - Ves03/Vphs));
ListPlot[{
Table[{Vphs/VA, 1/UemaxOverUe}, {Vphs, .001 VA, VA, .01 VA}],
Table[{Vphs/VA, 1/UemaxOverUe2}, {Vphs, .001 VA, VA, .01 VA}],
Table[{Vphs/VA, 1/UemaxOverUe3}, {Vphs, .001 VA, VA, .01 VA}]}, …Run Code Online (Sandbox Code Playgroud) 我有两个不同的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
]
Run Code Online (Sandbox Code Playgroud)
称之为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
]
Run Code Online (Sandbox Code Playgroud)
当它自己运行时,GlobalManipulate按预期工作,我看到更新的图a更改.线性产生的定义Null.
当LocalManipulate打开,运行时,GlobalManipulate不再有效.即使它重新运行它的情节会出现一秒然后消失.
我使用Mathematica 8的本地副本和Mathematica 7的远程副本重现了这一点.
问题必须涉及功能linear[x_] …
Mathematica 7.0似乎不喜欢在分母中有空白.谁能解释为什么会这样?
输入:
ClearAll["Global`*"];
(*Without blanks:*)
a^2 / b^2 /. a^2 / b^2 -> d
(*with:*)
a^2 / b^2 /. a^c_ / b^c_ -> d
(*Without blanks:*)
a^2 / b^2 /. (a / b)^2 -> d
(*With:*)
a^2 / b^2 /. (a / b)^c_ -> d
(*Without blanks:*)
a^2 / b^2 /. a^2 * b^(-2) -> d
(*With:*)
a^2 / b^2 /. a^c_ * b^(-c_) -> d
Run Code Online (Sandbox Code Playgroud)
输出:
d
a^2/b^2
d
a^2/b^2
d
a^2/b^2
Run Code Online (Sandbox Code Playgroud)
我正在努力解决一个更复杂的问题.我要做的替换是在表单中:
(a ^ c_. * Coefficient1_. …Run Code Online (Sandbox Code Playgroud) 我一直在玩 Scikit-learn 的 GMM 函数。首先,我刚刚创建了一个发行版x=y。
from sklearn import mixture
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
line_model = mixture.GMM(n_components = 99)
#Create evenly distributed points between 0 and 1.
xs = np.linspace(0, 1, 100)
ys = np.linspace(0, 1, 100)
#Create a distribution that's centred along y=x
line_model.fit(zip(xs,ys))
plt.plot(xs, ys)
plt.show()
Run Code Online (Sandbox Code Playgroud)
这产生了预期的分布:

接下来我给它拟合一个 GMM,并绘制结果:
#Create the x,y mesh that will be used to make a 3D plot
x_y_grid = []
for x in xs: …Run Code Online (Sandbox Code Playgroud) 我试图在GNU情节中绘制一个函数,我的情节与文章中的情节不同.在阅读GNU将函数解释为C时,我尝试用C编写函数.同样的问题.
最终我发现这个问题可能会出现这个问题:
#include <stdio.h>
#include <stdlib.h>
int main()
{
double p = 1.0;
double pMinusOneHalf1 = p - (1.0/2.0);
double pMinusOneHalf2 = p - (1/2);
printf("\nFirst = %lf \n Second = %lf\n\n", pMinusOneHalf1, pMinusOneHalf2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它给出了输出
First = 0.500000
Second = 1.000000
Run Code Online (Sandbox Code Playgroud)
只是想知道是否有人解释为什么C将假设"1"和"2"作为DOUBLE表达式中的INT.
对于人们来说似乎很容易被抓住.gcc的-Wall选项甚至没有评论它.