вывод с “Частным'” Содержанием в Пакете Mathematica

Я пытаюсь решить следующую проблему реализации в Mathematica 7.0 в течение нескольких дней теперь, и я не понимаю точно, что происходит так, я надеюсь, что кто-то может дать мне некоторые подсказки. У меня есть 3 функции, которые я реализовал в Mathematica в исходном файле с расширением *.nb. Они работают хорошо ко всем примерам. Теперь я хочу поместить эти функции в 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}]

Я получаю следующий ouput:

{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}

Конечно, я не понимаю, почему Частный' появляется перед любой локальной переменной, которую я возвратил в конечном результате. Я хотел бы не иметь это Частное' в вычисленном выводе. Какая-либо идея или лучшие объяснения, которые могли указать на меня, почему это происходит?

Большое спасибо за Вашу справку.

С наилучшими пожеланиями, madalina

8
задан madalina 30 April 2010 в 13:05
поделиться

3 ответа

Из обсуждения здесь , похоже, что присвоение символов внутри пакета глобальному контексту заставит их выводить без префикса частного контекста.

То есть любые символы, которые могут составлять часть вывода, могут быть объявлены с префиксом Global`, как в этом примере:

BeginPackage["PackageContext`"]; 
Rule1::usage = "Rule1 is a test exported rule."; 
Begin["`Private`"]; 
Rule1 = Cos[Global`x_]^2 + Sin[Global`x_]^2 :> Global`x; 
End[]; 
EndPackage[]; 

В вашем пакете это может выглядеть примерно так:

formEqs[complex_,{m_,n_}]:=Block[{complexnew,complexnew1, realeq, imageq, 
    expreal,expimag, polyrealF, polyimagF,s,t,u,v,a,b,c,
    Global`epsilon,Global`x,Global`y,Global`z},
complexnew:=complex/.{m->s+I*t,n->u+I*v};
complexnew1:=complexnew/.{s->(2 a Global`epsilon)/(1+a^2+b^2+c^2),t->(2 b 
   Global`epsilon)/(1+a^2+b^2+c^2),u->(2 c Global`epsilon)/(1+a^2+b^2+c^2),v->(-
   Global`epsilon+a^2 Global`epsilon+b^2 Global`epsilon+c^2 
   Global`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->Global`x,b->Global`y,c->Global`z};
polyimagF:=expimag/.{a->Global`x,b->Global`y,c->Global`z};

edit: Global переменным нужно давать префикс Global` везде, где они встречаются, как указано выше

2
ответ дан 5 December 2019 в 14:01
поделиться

Обычно возникает проблема, когда вы возвращаете символьные функции из пакета, и когда это происходит со мной, я рассматриваю это так, как будто я сделал что-то не так при написании пакета. Несмотря на то, что добавление к всем таким символам префикса Global «исправит» проблему, это лишает некоторых целей пакета: сокрытие реализации. Кроме того, поскольку он загрязняет глобальное пространство имен вашими символами, вы должны быть осторожны в том, как вы запускаете свой код, что еще больше нарушает цель пакета. Ваш пакет не должен заботиться о глобальной среде. Если ему что-то нужно, он может загрузить это сам либо в BeginPackage , либо с помощью Needs в частной части пакета.

Вместо этого вы можете выполнять те же функции, что и 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  

Внутренние ссылки на символьные переменные выполняются как обычно, но ваша функция будет теперь верните символическое выражение, используя любые глобальные символы, которые вы выбрали для использования. Это также отделяет ваш выбор имен переменных от деталей реализации вашей функции.

8
ответ дан 5 December 2019 в 14:01
поделиться

Попробуйте изменить Begin ["Private`] на Begin [" `Private`"] .

1
ответ дан 5 December 2019 в 14:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: