2011-12-06 43 views
9

Chuyên gia;Làm thế nào để yêu cầu Mathematica thay thế 0 thành công suất 0 bằng 1?

Với

f = (#1^#2) & 

Có cách nào để xác định 'f' ở trên như vậy mà nếu # 1 # 2 đều bằng không, thì giá trị của hàm thuần túy 'f' nên 1?

để khi tôi viết

f[0,0] 

nó sẽ trở lại 1 và không Không xác định?

btw, tôi biết tôi có thể viết

f = (If[#1 == 0 && #2 == 0, 1, #1^#2]) & 

Nhưng tôi muốn có một nguyên tắc chung hoặc mẫu, vì vậy tôi không phải viết những séc, như chức năng tinh khiết có thể phức tạp hơn (nhiều # trong nó) và tôi không muốn thực hiện nhiều lần kiểm tra 'nếu có khác' cho mỗi 0 0 0 có thể hiển thị.

nhờ

Cập nhật:

Có thể là tôi nên làm rõ hơn lý do tại sao tôi làm điều này.
Tôi có một người dùng chọn một chức năng từ menu. Chức năng là

a x^n0 + b y^n1 + c x^n2 y^n3 

đâu ở trên, các thông số 'n0', 'n1', 'n2' và 'n3' cũng có thể được lựa chọn từ các thanh trượt, và chúng có thể là không.

Bây giờ, 'x' và 'y' là tọa độ và các giá trị này có thể bằng không.

Do đó, có thể gặp phải 0^0 khi đánh giá hàm trên.

Có nhiều trường hợp để kiểm tra, khi tự làm. Ví dụ 'y^n3' có thể là 0^0 và không phải là khác, y^n1 có thể là 0^0 và không phải là khác, x^n2 y^n3 có thể là 0^0 và không phải là số khác, v.v. và vì vậy tôi phải xác định nhiều trường hợp khác nhau. (16 trường hợp có thể tôi nghĩ).

Và tôi đang cố tránh điều này. Nếu tôi có thể nói cho Mathematica thay thế 0^0 bằng 1 ở mức thấp hơn, thì cuộc sống sẽ đơn giản hơn.

Cập nhật 12/7/11 Cảm ơn mọi người đã trả lời và nhận xét, tất cả đều rất hữu ích và giải quyết được vấn đề của tôi và tôi đã học được từ chúng.

Tôi đã chọn câu trả lời Leonid vì nó cho phép tôi giải quyết vấn đề của mình với ít mã hóa bổ sung nhất.

Dưới đây là một ví dụ nhỏ

Manipulate[Row[{format[x, n], "=", eval[x, n]}], 
{{x, 0.0, "x="}, 0, 1, .1, Appearance -> "Labeled"}, 
{{n, 0.0, "n="}, 0, 1, .1, Appearance -> "Labeled"}, 
Initialization :> 
    (
    format[x_, n_] := HoldForm["(" x ")"^n]; 
    eval = Unevaluated[#1^#2] /. HoldPattern[0.0^0.0] :> 0.0 & 
    ) 
] 

tôi sử dụng số thực ở khắp mọi nơi trong mã của tôi (đó là một pde số giải), vì vậy đó là lý do tại sao tôi đã sử dụng 0.0 ở trên và không phải 0^0 để phù hợp với với những gì tôi đang làm.

enter image description here

+2

Bạn có chắc chắn muốn các giá trị này được đánh giá là 1 và không 0? Ký hiệu làm cho nó trông như thể bạn đang đánh giá các đa thức trong đó số mũ là int không âm hoặc có lẽ là số thực. Các cân nhắc liên tục sẽ chỉ ra rằng giá trị 0 có thể thích hợp hơn trong kịch bản đó. –

+0

@DanielLichtblau, Ok, cảm ơn, sẽ nhìn vào 0^0 được thay bằng 0 thay vì 1. Nhưng cả hai trường hợp, nếu tôi sử dụng IF THEN ELSE (hoặc tương đương chức năng của nó bằng cách xác định nhiều chữ ký khác nhau cho từng trường hợp có thể), có vẫn còn 16 trường hợp khác nhau. Đã hy vọng có một cách để ngắn mạch này, nhưng nói với Mathematica để thay thế 0^0 bởi X, nơi X là sự lựa chọn đúng (0 hoặc 1 vì nó có thể được). – Nasser

+0

Xem thêm phần thảo luận về nhóm toán này: http://mathforum.org/kb/message.jspa?messageID=6577581&tstart=0 và câu hỏi này trên các lập trình viên SE: http://programmers.stackexchange.com/questions/9788/how- không-ngôn ngữ-x-xử lý-indeterminate-forms-like-00 –

Trả lời

10

Tôi đồng ý với câu trả lời của @Deep vàng, nhưng nếu bạn nhấn mạnh vào một chức năng thuần túy, đây là một cách:

f = Unevaluated[#1^#2] /. HoldPattern[0^0] :> 1 & 

EDIT

Ở trong lĩnh vực chức năng thuần túy, tình huống bạn mô tả trong bản chỉnh sửa của bạn có thể được giải quyết theo cách tương tự như giải pháp cho ví dụ ban đầu cụ thể của bạn. Bạn có thể tự động hoá này với một chút nhỏ của Lập trình meta định chức năng biến sau:

z2zProtect[Function[body_]] := 
    Function[Unevaluated[body] /. HoldPattern[0^0] :> 1] 

Sau đó, mã trước đây của tôi có thể được viết lại như sau:

f = z2zProtect[#1^#2 &] 

Nhưng bạn có thể là thế này hơn nói chung, đối với ví dụ:

ff = z2zProtect[#1^#2 + 2 #2^#3 + 3 #3^#4 &] 

In[26]:= ff[0,0,0,0] 
Out[26]= 6 
+0

+1 Tốt, mặc dù hãy để tôi chỉ ra rằng 'f [foo, 0]' trả về '1' cho undefined' foo'. –

+0

@Deep Yellow Cảm ơn bạn đã upvote. Về nhận xét của bạn - điều này đúng như mong đợi và dựa trên quy tắc tích hợp cho 'Power', không phải theo định nghĩa cụ thể của tôi. Giải pháp của bạn thể hiện hành vi tương tự. –

+0

Oh yeah :-) * Mathematica * giả sử các biểu thức không xác định không bằng 0 cho 'Power'. –

4

Bạn có thể thử viết nó như f = Quiet[Check[#1^#2,1]] &.

Quiet sẽ chặn thông báo "Power::indet: "Indeterminate expression 0^0 encountered."Check sẽ thay thế kết quả bằng 1 nếu không xác định.

Có lẽ tốt hơn nên sử dụng một số chức năng như s = Quiet[Check[#1, 1]] và bao bọc các biểu thức của bạn trong đó.

+5

Lưu ý rằng điều này cũng sẽ ngăn chặn tất cả mọi thứ mà sản xuất cùng một lỗi và đầu ra 1, không phân biệt cho dù đó là kết quả mong muốn. Ví dụ, 'f [0, I]'. – abcd

16

Tất nhiên có nhiều cách để thực hiện mọi thứ trong Mathematica, nhưng thành ngữ thiết kế tôi thường sử dụng là viết "hàm" (thực tế, mẫu) với độ đặc hiệu giảm. Mathematica có thuộc tính sẽ áp dụng các mẫu cụ thể hơn trước khi ít cụ thể hơn.

Vì vậy, đối với trường hợp của bạn tôi chỉ cần viết:

Clear[f]; 
f[0, 0] = 1; 
f[a_, b_] := a^b; 

tôi giả sử bạn mong đợi để làm việc với các giá trị số nguyên vì đó là bối cảnh thông thường cho loại tình huống, ví dụ khi đánh giá các hàm cơ sở của Bernstein.

+0

+1 Câu trả lời hay, rõ ràng không có kiểu cách. BTW, tôi nghĩ rằng bạn có nghĩa là để nói "với độ đặc hiệu giảm". – DavidC

+0

@DavidCarraher: Cảm ơn, đã sửa. –

3

Tôi hơi ngạc nhiên khi sửa chữa tầm thường (mặc dù hơi nguy hiểm) không được đề cập trước đó. Nếu bạn thực sự không mong đợi biểu thức 0^0 xuất hiện trong bất kỳ ngữ cảnh nào mà bạn (a) lo lắng rằng nó đã làm, hoặc (b) muốn đánh giá nó thành một thứ khác ngoài 1, bạn có thể chỉ cần thử

Unprotect[Power]; 
Power[0, 0] = 1; 
Protect[Power]; 
0^0 

tôi cần khắc phục điều này trong một tình huống mà một chức năng phức tạp đã có một số cuộc gọi đến biểu thức có dạng x^n nơi x là có thật và n là một số nguyên, trong trường hợp này 0^0 nên được xem như giới hạn của x^0=1 như x chuyển đến 0.

Điều quan trọng cần lưu ý là thực hiện điều này sẽ 'làm ô nhiễm' Power cho phiên hạt nhân hiện tại và do đó có thể phá vỡ các sổ ghi chép khác chạy đồng thời và các điều kiện (a) và (b) có thể không giữ.Vì Power nằm trong ngữ cảnh System՝ thay vì Global՝, có thể khó phân tách các ngữ cảnh của sổ ghi chép khác nhau để tránh các xung đột do bản sửa lỗi này tạo ra.

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