相关疑难解决方法(0)

如何定义Manipulate控件变量定义的一部分以减少代码重复

这与这个问题有点关系

在Mathematica中将控制定义为变量

但是上面的问题没有回答我的问题,因为它讨论了完整的控制定义.(我也尝试过那里展示的一些技巧,但它们对我的问题不起作用).

我现在只询问部分控件的定义.(使用这种论坛格式也很难跟进一个老问题.因为使用微小的评论区域,很难提出更多的问题,并且更像是在询问空间较大的新问题时,可以粘贴代码和图片).

我所做的所有尝试都不起作用.我将从简单的例子开始解释这个问题.

假设有人想写

Clear["Global`*"];

Manipulate[Plot[f*g, {x, -1, 1}],
 Grid[{
   {Style["f(x)="], 
    PopupMenu[Dynamic[f], {x, x^2, x^3}, ImageSize -> Tiny]},{Style["g(x)="], 
    PopupMenu[Dynamic[g], {x, x^2, x^3}, ImageSize -> Tiny]}
   }]
 ]
Run Code Online (Sandbox Code Playgroud)

您可以看到每个控件定义中都存在重复的代码重复.(像ImageSize,Spacings->和许多其他装饰设置之类的东西会反复重复每个控件.

在此输入图像描述

如果我能写出类似的东西,那会是多么美好的事情

Manipulate[Plot[f*g, {x, -1, 1}],
 Grid[{
   {Style["f(x)="], PopupMenu[Dynamic[f], Evaluate@Sequence@v]},
   {Style["g(x)="], PopupMenu[Dynamic[g], Evaluate@Sequence@v]}
   }],

 Initialization :>
  (
   v = {{x, x^2, x^3}, ImageSize -> Tiny}
   )
 ]
Run Code Online (Sandbox Code Playgroud)

但这不起作用.我在上面的那一行尝试了许多其他的东西,没有任何作用.喜欢

{Style["f(x)="], PopupMenu[Dynamic[f], v]},
Run Code Online (Sandbox Code Playgroud)

{Style["f(x)="], PopupMenu[Dynamic[f], Evaluate@v]}
Run Code Online (Sandbox Code Playgroud)

Manipulate[Plot[f*g, {x, -1, 1}],

 {{v, {{x, x^2, x^3}, ImageSize -> Tiny}}, None},
 Grid[{
   {Style["f(x)="], PopupMenu[Dynamic[f], …
Run Code Online (Sandbox Code Playgroud)

wolfram-mathematica

12
推荐指数
2
解决办法
2133
查看次数

在Mathematica中安全地设置"结构"

关于在Mathematica中创建记录的问题已在少数几个地方讨论过,例如Mathematica中的Struct数据类型?.

所有这些方法的问题在于,人们似乎失去了对每个参数进行特定额外检查的能力,就像人们做的那样x_?NumericQ.

我的问题是:在Mathematica中有没有办法制作记录或结构,但是能够在各个元素上使用上述检查?

我试图找到一种方法来使用,因为我厌倦了在它们上面调用10个参数的函数(有时候一个人无法避免这种情况),即使我试图使每个函数都非常具体,最小化数量参数,一些功能只需要很多参数来完成特定的工作.

首先,我展示了我所知道的三种方法.

方法1

foo[p_]:=Module[{},
    Plot[Sin[x],{x,from/.p,to/.p}]
]
p={from->-Pi,to->Pi};
foo[p]
Run Code Online (Sandbox Code Playgroud)

优点:安全,好像我将符号'从'更改为其他东西,它仍然有效.如下例所示.

foo[p_]:=Module[{},
    Plot[Sin[x],{x,from/.p,to/.p}]
]
p={from->-Pi,to->Pi};
from=-1; (* By accident the symbol from was set somewhere. It will work*)
foo[p]
Run Code Online (Sandbox Code Playgroud)

方法2

Clear[p,foo];
foo[p_]:=Module[{},
    Print[p];
    Plot[Sin[x],{x,p["from"],p["to"]}]
]
p["from"] = -Pi;
p["to"]   = Pi;

foo[p]
Run Code Online (Sandbox Code Playgroud)

优点:也是安全的,字符串是不可变的.不必担心"从"值的变化.但到处都有字符串不太可读?

方法3

Clear[p,to,from];
foo[p_]:=Module[{},
    Plot[Sin[x],{x,p[from],p[to]}]
]
p[from] = -Pi;
p[to]   = Pi;

foo[p]
Run Code Online (Sandbox Code Playgroud)

缺点:如果任何符号'从'或'到'某处被覆盖,将导致问题,如

from=-4; (*accidentally the symbol from is assigned a value*)
foo[p]   
Run Code Online (Sandbox Code Playgroud)

所以.我认为方法(1)是最安全的.但现在我失去了这样做的能力:

foo[from_?NumericQ, to_?NumericQ] := Module[{},
    Plot[Sin[x], {x, from, to}] …
Run Code Online (Sandbox Code Playgroud)

wolfram-mathematica

5
推荐指数
1
解决办法
1720
查看次数

标签 统计

wolfram-mathematica ×2