Wolfram mathematica Mathematica中无代码重复的动态

Wolfram mathematica Mathematica中无代码重复的动态,wolfram-mathematica,Wolfram Mathematica,我正在尝试创建三个单独的图形,此代码将为您提供以下想法: f[t_] := Sin[10 t] + Cos[15 t]; Slider[Dynamic[dx], {0.01, 1}] var = Dynamic[Fourier[Table[f[t], {t, 0, 100, dx}]]]; ListLinePlot[Abs[var]] ListLinePlot[Re[var]] ListLinePlot[Im[var]] 这将不起作用,因为var尚未计算,所以ListLinePlot/Abs/

我正在尝试创建三个单独的图形,此代码将为您提供以下想法:

f[t_] := Sin[10 t] + Cos[15 t];
Slider[Dynamic[dx], {0.01, 1}]
var = Dynamic[Fourier[Table[f[t], {t, 0, 100, dx}]]];
ListLinePlot[Abs[var]]
ListLinePlot[Re[var]]
ListLinePlot[Im[var]]
这将不起作用,因为var尚未计算,所以ListLinePlot/Abs/Re/Im无法将其识别为数字列表。Dynamic必须换行ListLinePlot

使用Dynamic works包装ListLinePlot和其他所有内容。但是,我必须为每个图形计算一次傅里叶[表],根据原理,我不想有这种代码的重复

这是一种避免代码重复的方法,但不像上面我建议的不工作示例那样具有语义,而且它将所有序列放在一个图形中,而不是放在三个单独的图形中:

Dynamic[
 ListLinePlot[
  (#[Fourier[
       Table[f[t], {t, 0, 100, dx}]
       ]]) & /@ {Abs,Re,Min}, DataRange -> {0, 100}
  ]
 ]
希望您现在可以看到我正在努力实现的目标。类似于我的第一段代码,只是它应该可以工作。我如何做到这一点?

未经测试:

f[t_] := Sin[10 t] + Cos[15 t];
Slider[Dynamic[dx], {0.01, 1}]
Dynamic[var = Fourier[Table[f[t], {t, 0, 100, dx}]]];
Dynamic[ListLinePlot[Abs[var]]]
Dynamic[ListLinePlot[Re[var]]]
Dynamic[ListLinePlot[Im[var]]]

我认为这应该只计算一次
Fourier
。根据我的理解,
ListLinePlot
s应该在评估
Fourier
后由var的变化触发(注意
var
的赋值在
动态
中)。

您可能想要这样的东西:

f[t_] := Sin[10 t] + Cos[15 t]

DynamicModule[{var},
 Manipulate[
  var = Fourier[Table[f[t], {t, 0, 100, dx}]];
  {ListLinePlot[Abs[var]],
   ListLinePlot[Re[var]],
   ListLinePlot[Im[var]]},
  {dx, 0.01, 1}
]]

在大多数情况下,您只需要围绕需要重新计算的表达式包装
Dynamic
。正如您所注意到的,如果围绕
var
的内容包装
Dynamic
,它将不起作用,因为当您将
var
传递给它时,
ListPlot
将看到一个
Dynamic
头部,而不是列表。Wh在这种情况下,需要重新计算的at是完整的
列表图

正确的解决方案是为
var
(即
:=
而不是
=
)使用延迟定义,并将
动态
环绕
列表图

f[t_] := Sin[10 t] + Cos[15 t];
Slider[Dynamic[dx], {0.01, 1}]

var := Fourier[Table[f[t], {t, 0, 100, dx}]];

Dynamic@ListLinePlot[Abs[var]]
Dynamic@ListLinePlot[Re[var]]
Dynamic@ListLinePlot[Im[var]]
人们经常会混淆
动态
,因为它有时会显示在表达式的深处,例如在
滑块
示例中。但是
动态
有一个不同的功能:设置值

通常,除非用于设置值,
Dynamic
始终需要是表达式中最外层的头(也有一些例外,特别是当我们处理与屏幕上显示的内容直接对应并由前端处理的表达式时,例如图形基元:
Slider[Dynamic[x],{0,5}]
图形[{磁盘[],Dynamic@Disk[{x,0}]}]
将起作用。)

Dynamic
只影响前端表达式的显示方式,而不影响内核对表达式的看法。下面是一个示例:

x=1
arr = {Dynamic[x], 2, 3}
前端将
arr
显示为
{1,2,3}
,但内核仍将其视为
{Dynamic[x],2,3}
。因此,如果我们计算
Total[arr]
,前端将显示为
1+5
,但内核将看到它是否为
Dynamic[x]+5
。我希望这能稍微澄清一下情况


注意:我不想在这个解决方案中使用
操纵
,因为OP也没有使用它。
操纵
只是一个高级便利功能,它所做的一切都可以通过
动态
和一些控件(如
滑块
)来实现。我无法让它工作。它看起来有相同的pr问题。很遗憾,我目前无法测试它。但您是否确保清除了所有旧定义(最好是启动一个新内核)?您如何检查执行傅里叶变换的频率?请注意,移动滑块可能会触发对多个不同值的执行。如果您直接指定给
dx
,会发生什么?我知道列表是正确的,因为它会在红色背景上打印出来。例如:ListLinePlot[Abs[]]。值会随着滑块的转动而改变。您看到新的吗?大多数以前在[mathematica]标记中回答的人都搬到了那里。您可能会在那里更快地得到更好的答复。