gpt4 book ai didi

wolfram-mathematica - Mathematica 中的动态无重复代码

转载 作者:行者123 更新时间:2023-12-04 08:19:04 26 4
gpt4 key购买 nike

我正在尝试创建三个独立的图表,这段代码将为您提供思路:

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 包装 ListLinePlot 和其他一切都有效。但是然后我将不得不为每个图计算一次 Fourier[Table[... 。根据原则,我不想有这种重复的代码。

这是一种避免代码重复的方法,但不像我上面提出的无效示例那样语义化,而且它将所有系列放在一个图中而不是三个单独的图中:

Dynamic[
ListLinePlot[
(#[Fourier[
Table[f[t], {t, 0, 100, dx}]
]]) & /@ {Abs,Re,Min}, DataRange -> {0, 100}
]
]

希望您现在可以看到我正在努力实现的目标。类似于我的第一段代码,但它应该可以工作。我该怎么做?

最佳答案

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

正确的解决方案是为 var 使用延迟定义(即 := 而不是 =)并包装 Dynamic 围绕 ListPlot:

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 有一个不同的功能:设置一个值。

通常,除非用于设置一个值,否则 Dynamic 总是需要成为表达式中最外层的头部。 (有一些异常(exception),特别是当我们处理直接对应于屏幕上显示的内容并由前端处理的表达式时,例如图形基元:Slider[Dynamic[ x], {0, 5}], Graphics[{Disk[], 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。我希望这能稍微澄清一下情况。

注意:我不想在此解决方案中使用 Manipulate,因为 OP 也没有使用它。 Manipulate 只是一个高级便利函数,它所做的一切都可以通过 Dynamic 和一些控件(例如 Slider)来实现。

关于wolfram-mathematica - Mathematica 中的动态无重复代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9249020/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com