Mathematica输出中的"$"符号

5
我在以下代码中遇到了一些小问题:
Lagrange[list_] := 
  Module[{points = list, length, k, j, m, x, g}, 
    length = Length[points]; 
    k = length - 1; 
    f = Sum[points[[j + 1,2]]*Product[If[j != m, (x - points[[m + 1,1]])/
          (points[[j + 1,1]] - points[[m + 1,1]]), 1], {m, 0, k}], {j, 0, k}]; 
    g = FullSimplify[Expand[f]]; 
    Return[f]]

我得到的输出是:
Out[101]= 0. -1.85698 (-1.5+x$26810) (-0.75+x$26810) (0. +x$26810) (0.75+x$26810)
         +0.490717 (-1.5+x$26810) (-0.75+x$26810) (0. +x$26810) (1.5 +x$26810)
         -0.490717 (-1.5+x$26810) (0. +x$26810) (0.75 +x$26810) (1.5 +x$26810)
         +1.85698 (-0.75+x$26810) (0. +x$26810) (0.75 +x$26810) (1.5 +x$26810)

我关注的是这些"$"符号。我不知道它们的含义,也找不到相关的文档,而且它们阻止了这个多项式的绘制。

2个回答

6
您输出中的$符号来自于Module的词法作用域生成的唯一变量(请参见mathematica/ref/Module的更多信息部分)。这就是为什么我让我的LagrangePoly函数接受多项式所在的符号。我使用了LagrangePoly[list_, var_:x],默认为全局符号x
一个简单的问题示例是:
In[1]:= Module[{x}, x]    
Out[1]= x$583

"local" 变量中的数字 x$nnn 来自全局变量 $ModuleNumber

如果你不理解这个,那么你应该阅读教程 Blocks Compared with Modules


如果我想将这个函数放到一个包中以便在另一个笔记本中使用,你认为我在这种情况下需要使用模块吗? - Matthew Kemnetz
2
@Matthew: 如果这个代码将被移入一个包中,您可能希望能够选择在多项式中使用的符号。因此,像我建议的那样,应该向函数传递一个符号“x”。在“Module”中,您也不需要“j”或“m”,因为它们已经被求和和乘积所限定了范围。最后,为什么你要计算'g',但是在你的代码中却返回'f'? - Simon
我从计算中删除了"g"。 "g"是不必要的,来自旧版本。感谢您帮我发现这个问题。 - Matthew Kemnetz
我想告诉你……现在它完美地运行了,就像我希望的那样。感谢你的所有帮助!接下来是 Hermite 插值多项式! - Matthew Kemnetz
1
Simon,比“x”更好的是\[FormalX],这样可以避免大多数冲突。 - Mr.Wizard

2

在你的代码中,x是一个局部变量。然而,你正在返回一个包含x的表达式。局部化变量的目的是它们不应该出现在它们的上下文之外,这种情况下是模块。

考虑这个简单的例子:

adder[x_] := Module[{y}, Return[x + y]]

adder[2] 的结果为:2 + y$1048

一个好的实践是认识到我们的函数 adder 实际上应该返回一个函数。

adder[x_] := Function[{y}, x + y]

twoAdder = adder[2];

twoAdder[3]的结果是:5


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接