【问题标题】:A problem in Mathematica 8 with function declarationMathematica 8 中的函数声明问题
【发布时间】:2011-05-18 14:45:23
【问题描述】:

这是一个奇怪的结果,在这个例子中定义为“functionB”的函数。有人可以解释一下吗?我想绘制functionB[x]functionB[Sqrt[x]],它们肯定是不同的,但是这段代码显示functionB[x] = functionB[Sqrt[x]],这是不可能的。

model = 4/Sqrt[3] - a1/(x + b1) - a2/(x + b2)^2 - a3/(x + b3)^4;
fit = {a1 -> 0.27, a2 -> 0.335, a3 -> -0.347, b1 -> 4.29, b2 -> 0.435,
    b3 -> 0.712};
functionB[x_] := model /. fit

Show[
 ParametricPlot[{x, functionB[x]}, {x, 0, 1}],
 ParametricPlot[{x, functionB[Sqrt[x]]}, {x, 0, 1}]
 ]

functionB[x] 必须与functionB[Sqrt[x]] 不同,但在这种情况下,两行相同(这是不正确的)。

【问题讨论】:

  • 这绝对不是错误...请参阅下面的答案(当然还有很多其他人很快就会出现)
  • 下次我用 MMA 教学时,我会尽量记住这个例子来迷惑/挑战我的学生。 :) 一些建议:我强烈建议您获取“Mathematica Navigator”(第 3 版)的副本。它价格便宜,并且包含许多示例来清理您的编程思维过程。接下来,获取 Sal 的“Mathematica Cookbook”——您应该能够以 9.99 美元的价格在线找到电子书交易。一旦对这些感到满意,请下载 Leonid Shifrin 的“Mathematica Programming - An Advanced Introduction”(它是免费的!)警告:在你准备好之前不要深​​入研究 Leonid 的书!他是个聪明人。
  • ParametricPlot 在这里有点矫枉过正,因为第一个坐标是一个普通的 x。 Plot[functionB[x], {x, 0, 1}] 就够了。
  • @telefunken 请不要对列昂尼德的书发表这样的评论。他潜伏在这里,你的热情可能会让他重新考虑赠送他的书! :D
  • @belisarius, @telefunkenvf14 关于知识共享许可的好处是,在它下发布后我是否改变主意都无关紧要,至少对于在它下发布的任何版本——那个特定版本将永远是免费的:)。但无论如何,所讨论的问题超出了它的范围(双关语)。除了@acl 的出色回答之外,该线程可能是相关的(由于其格式,您需要跟踪回复才能看到所有回复 - 不像谷歌为您执行此操作的谷歌群组)forums.wolfram.com/mathgroup/archive/2010/May/msg00102.html

标签: wolfram-mathematica mathematica-8


【解决方案1】:

如果您尝试?functionB,您会看到它存储为functionB[x_]:=model/.fit。因此,只要您现在有functionB[y],对于任何y,Mathematica 都会计算model/.fit,得到4/Sqrt[3] - 0.335/(0.435 + x)^2 + 0.347/(0.712 + x)^4 - 0.27/(4.29 + x)

这与使用SetDelayed(即:=)有关。每次 Mathematica 看到模式 f[_] 时,都会重新计算 functionB[x_]:=model/.fit 的 rhs。您将模式命名为 x 无关紧要。

您想要的可以通过例如实现functionC[x_] = model /. fit。也就是使用Set(=)而不是SetDelayed(:=),来评估右声道。

希望这足够清楚(可能不是)...

【讨论】:

  • 谢谢,我明白了。投票给你!
  • 如果它回答了您的问题,您可以“接受”它作为答案。或者你可以等着看是否有其他更好的答案出现
  • @acl,在某一时刻,我认为这不会奏效,您必须先 Evaluate RHS 并使用 SetDelayed。但是,根据 Scope 下的docs,它可以正常工作(也在 v.7 中)。我想知道什么时候改变的。所以,如果你教我一些关于旧功能的新知识,你会得到 +1。
  • @rcollyer 我确定 Mma 版本 4 到 8 都支持以这种方式使用 Set。我怀疑这种行为会一直追溯到 v1,但也许一个旧的(er)计时器可以让我直截了当。
  • @WReach,我似乎记得它对我不起作用,但我已经很久没有尝试过了。 (不过,如果有问题,我不小心做了这个,这是我改变的第一件事。)我可能会记住 v.3 中的行为,就像我第一次积极使用 mma 时一样。
【解决方案2】:

您可能想尝试在 functionB 中定义模型,这样两个地方的 x 都是相关的:

fit = {a1 -> 0.27, a2 -> 0.335, a3 -> -0.347, b1 -> 4.29, b2 -> 0.435, b3 -> 0.712};
functionB[x_] := Module[
  {model = 4/Sqrt[3] - a1/(x + b1) - a2/(x + b2)^2 - a3/(x + b3)^4},
  model /. fit
]

【讨论】:

  • dev,在重新阅读文档之前,我同意这将适用于涉及 Set 的 acl 解决方案不起作用的情况。但是,显然您也可以使用带有 Set 的模式规则,并得到您期望的答案。
猜你喜欢
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
  • 2017-12-08
  • 2020-11-01
  • 1970-01-01
  • 2014-03-12
  • 2014-07-12
  • 1970-01-01
相关资源
最近更新 更多