gpt4 book ai didi

wolfram-mathematica - 输出为 "Private` "Mathematica 包中的内容

转载 作者:行者123 更新时间:2023-12-04 06:28:23 33 4
gpt4 key购买 nike

我正在尝试解决 Mathematica 7.0 中的以下实现问题,但我不明白到底发生了什么,所以我希望有人能给我一些提示。
我在一个扩展名为 *.nb 的源文件中在 Mathematica 中实现了 3 个函数。
他们对所有例子都很好。现在我想将这些功能放入 3 个不同的包中。因此,我创建了三个扩展名为 .*m 的不同包,我在其中放置了所有所需的 Mathematica 函数。
“stereographic.m”包中包含代码的示例:

BeginPackage["stereographic`"]

stereographic::usage="The package stereographic...."
formEqs::usage="The function formEqs[complexBivPolyEqn..."
makePoly::usage="The function makePoly[algebraicEqn] ..."
getFixPolys::usage="The function..."
milnorFibration::usage="The function..."

Begin["Private`"]
Share[];

formEqs[complex_,{m_,n_}]:=Block[{complexnew,complexnew1, realeq, imageq, expreal,
expimag, polyrealF, polyimagF,s,t,u,v,a,b,c,epsilon,x,y,z},
complexnew:=complex/.{m->s+I*t,n->u+I*v};
complexnew1:=complexnew/.{s->(2 a epsilon)/(1+a^2+b^2+c^2),t->(2 b
epsilon)/(1+a^2+b^2+c^2),u->(2 c epsilon)/(1+a^2+b^2+c^2),v->(-
epsilon+a^2 epsilon+b^2 epsilon+c^2
epsilon)/(1+a^2+b^2+c^2)};
realeq:=ComplexExpand[Re[complexnew1]];
imageq:=ComplexExpand[Im[complexnew1]];
expreal:=makePoly[realeq];
expimag:=makePoly[imageq];
polyrealF:=expreal/.{a->x,b->y,c->z};
polyimagF:=expimag/.{a->x,b->y,c->z};

{polyrealF,polyimagF}
]

End[]
EndPackage[]

现在测试我加载包的功能
Needs["stereographic`"]

一切正常。但是当我测试这个功能时,例如
formEqs[x^2-y^2,{x,y}]

我得到以下输出:
{Private`epsilon^2 + 2 Private`x^2 Private`epsilon^2 + 
Private`x^4 Private`epsilon^2 -
6 Private`y^2 Private`epsilon^2 +
2 Private`x^2 Private`y^2 Private`epsilon^2 +
Private`y^4 Private`epsilon^2 -
6 Private`z^2 Private`epsilon^2 +
2 Private`x^2 Private`z^2 Private`epsilon^2 +
2 Private`y^2 Private`z^2 Private`epsilon^2 +
Private`z^4 Private`epsilon^2,
8 Private`x Private`y Private`epsilon^2 +
4 Private`z Private`epsilon^2 -
4 Private`x^2 Private`z Private`epsilon^2 -
4 Private`y^2 Private`z Private`epsilon^2 -
4 Private`z^3 Private`epsilon^2}

当然我不明白为什么 Private` 出现在我在最终结果中返回的任何局部变量的前面。我不希望在计算输出中有这个 Private`。
任何想法或更好的解释可以告诉我为什么会发生这种情况?

非常感谢您的帮助。

最良好的祝愿,
马达利娜

最佳答案

当您从包中返回符号函数时,您的问题很常见,当这种情况发生在我身上时,我认为好像我在编写包时做错了什么。在所有此类符号前加上 Global将“解决”问题,它破坏了包的一些目的:实现隐藏。此外,由于它会用符号污染全局 namespace ,因此在运行代码时必须小心,这进一步违背了包的目的。你的包不应该关心全局环境是什么样的。如果它需要任何东西,它可以在 BeginPackage 中自行加载。或使用 Needs在包的私有(private)部分中。

相反,您可以执行 Plot 之类的功能。做,接受 Symbol参数,如下:

 (*Note: if z is not a symbol this won't work, i.e. if it is Set to some value.*)
In[1] := f[x_Symbol] := x^2
In[2] := f[z]
Out[2] := z^2

在内部,符号变量像正常一样被引用,但您的函数现在将使用您选择使用的任何全局符号返回一个符号表达式。这也将您对变量名的选择与函数的实现细节解耦。

关于wolfram-mathematica - 输出为 "Private` "Mathematica 包中的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2744624/

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