2010-04-30 29 views
8

Tôi đang cố gắng giải quyết vấn đề triển khai sau trong Mathematica 7.0 trong vài ngày và tôi không hiểu chính xác điều gì đang xảy ra vì vậy tôi hy vọng ai đó có thể cho tôi một số gợi ý. Tôi có 3 hàm mà tôi đã triển khai trong Mathematica trong tệp nguồn có phần mở rộng * .nb. Chúng hoạt động tốt cho tất cả các ví dụ. Bây giờ tôi muốn đặt các chức năng này thành 3 gói khác nhau. Vì vậy, tôi đã tạo ra ba gói khác nhau với phần mở rộng. * M trong đó tôi đặt tất cả hàm Mathematica mong muốn. Một ví dụ trong gói "stereographic.m" có chứa mã:Đầu ra với nội dung "Riêng tư" trong Gói Mathematica

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[] 

Bây giờ để kiểm tra chức năng tôi tải các gói

Needs["stereographic`"] 

mọi thứ đều ổn. Nhưng khi tôi kiểm tra chức năng ví dụ với

formEqs[x^2-y^2,{x,y}] 

tôi nhận được ouput sau:

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

Tất nhiên tôi không hiểu tại sao Private` xuất hiện trước mặt bất kỳ biến địa phương mà tôi trở về trong kết quả cuối cùng. Tôi không muốn có tính riêng tư này trong kết quả tính toán. Bất kỳ ý tưởng hay giải thích nào tốt hơn có thể cho tôi biết lý do tại sao điều này xảy ra?

Cảm ơn bạn rất nhiều vì sự giúp đỡ của bạn.

Best wishes, madalina

+0

Hãy thử đăng bài trên comp.soft-sys.mathematica, tôi nghĩ cộng đồng người dùng Mathematica ở đó lớn hơn và hiểu biết nhiều hơn cộng đồng ở đây. –

+0

Tính đến thời điểm này, bạn đã hỏi 23 câu hỏi nhưng chưa chấp nhận bất kỳ câu trả lời nào. Không có câu trả lời nào đáp ứng tiêu chí của bạn? – rcollyer

Trả lời

2

Từ discussion here, nó trông giống như gán những biểu tượng bên trong gói với bối cảnh toàn cầu sẽ làm cho họ được xuất ra mà không có tiền tố bối cảnh riêng.

Đó là, bất kỳ biểu tượng mà có thể là một phần của đầu ra có thể được khai báo với một tiền tố Global`, như trong ví dụ này:

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[]; 

Trong gói của bạn, nó có thể trông giống như thế này:

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

chỉnh sửa: các biến toàn cầu cần phải được cung cấp các tiền tố Global` bất cứ nơi nào chúng xảy ra, như trên

+0

Tôi đã thử với Global' trong mã cho các biến x, y, z, epsilon được trả lại trong kết quả nhưng vẫn Riêng tư xuất hiện trong kết quả. Nếu tôi xóa Bắt đầu ["Riêng tư"] thì đầu ra trông đẹp nhưng thông báo cảnh báo cho x, y, z, epsilon xuất hiện: x :: shdw: "Biểu tượng x xuất hiện trong nhiều ngữ cảnh " stereographic' ", Định nghĩa "Toàn cầu", trong ngữ cảnh "ảnh lập thể" có thể bị che khuất hoặc bị che khuất bởi các định nghĩa khác. " Nếu tôi thêm Xóa [x, y, z, epsilon] thì thông báo cảnh báo sẽ biến mất nhưng Xóa sẽ xuất hiện ở đầu ra .. – madalina

+0

Nếu có thể khởi động lại hạt nhân giữa mỗi lần thử nghiệm của bạn. Bằng cách đó bạn không cần phải lo lắng về sự can thiệp từ các đánh giá trước đó, nó hoạt động tốt hơn sau đó loại bỏ. Tôi nghĩ rằng codeulike có câu trả lời đúng. Ngoài ra nó không phải là thời tiết rõ ràng bạn thay thế tất cả các x, y, z, epsilon với Global'x, ... trong cả hai đối số đầu tiên và thứ hai của Block. Tôi chỉ thử nghiệm nó trên Mathematica 7.0.1 sau khi khởi động lại và nó làm việc cho tôi. – Davorak

+0

Cảm ơn Davorak, tôi không có Mathematica tiện dụng. Có lẽ các biến phải được bắt đầu bằng Global khi chúng được đề cập trong gói? – codeulike

7

vấn đề của bạn là một phổ biến một khi bạn đang trở func biểu tượng tions từ một gói, và khi điều này xảy ra với tôi, tôi xem nó như thể tôi đã làm một cái gì đó sai trong văn bản gói. Trong khi tiền tố tất cả các ký hiệu như vậy với Global sẽ "khắc phục" sự cố, nó sẽ đánh bại một số mục đích của gói: thực hiện ẩn. Ngoài ra, vì nó gây ô nhiễm không gian tên toàn cầu với các biểu tượng của bạn, bạn phải cẩn thận trong cách bạn chạy mã của bạn mà tiếp tục đánh bại mục đích của một gói. Gói của bạn không nên quan tâm đến môi trường toàn cầu. Nếu nó cần bất cứ thứ gì, nó có thể tự tải nó hoặc trong BeginPackage hoặc sử dụng Needs trong phần riêng của gói.

Thay vào đó, bạn có thể làm những gì các chức năng như Plot làm, chấp nhận một tham số Symbol, như sau:

(*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 

Bên trong, biến biểu tượng được tham chiếu như bình thường, nhưng chức năng của bạn bây giờ sẽ trả về một biểu tượng sử dụng bất cứ điều gì các ký hiệu chung mà bạn đã chọn để sử dụng. Điều này cũng tách rời sự lựa chọn của bạn về tên biến với các chi tiết thực hiện chức năng của bạn.

1

Thử thay đổi Begin["Private`"] thành Begin["`Private`"].

+0

Không nhận thấy lỗi đó. Nắm bắt tốt. Kể từ khi trình soạn thảo đang chơi havoc vui vẻ với mã, 'Private' nên được đi trước và tiếp theo là một dấu mộ. Bằng cách đó, 'Private' sẽ là một ngữ cảnh phụ của bối cảnh gói. Thật không may, điều này không giải quyết được vấn đề trả lại các biểu tượng từ phần riêng tư của gói. – rcollyer

1

Bạn có thể sử dụng formal symbols thay vì các ký hiệu thông thường để tránh sự cố của mình.

Đồng thời, việc sử dụng biểu tượng chính thức là cách thuận tiện hơn để xuất biểu thức chung liên quan đến các tham số chính thức. Họ không có giá trị và giá trị cho chúng không thể được vô tình thiết lập vì chúng là Protected.

Bạn có thể sử dụng bảng ký tự "Ký tự đặc biệt" để biểu tượng chính thức liên tiếp.

Các vấn đề liên quan