2012-03-07 44 views
5

Sử dụng mã FullSimplify[Abs[q + I*w], Element[{q, w}, Reals]] kết quả trongMathematica không tính giá trị tuyệt đối của một số phức tạp với hệ số thực

Abs[q + I w] 

và không

Sqrt[q^2 + w^2] 

tôi đang thiếu gì?

P.S. Assuming[{q \[Element] Reals, w \[Element] Reals}, Abs[q + I*w]] cũng không hoạt động. Lưu ý: Simplify[Abs[w]^2, Element[{q, w}, Reals]]Simplify[Abs[I*q]^2, Element[{q, w}, Reals]] hoạt động.

+0

Tôi hiện không ở máy Mathematica của mình nên không thể kiểm tra bất cứ điều gì nhưng tôi có câu hỏi cho bạn. Theo nghĩa nào thì Sqrt [q^2 + w^2] đơn giản hơn Abs [q + Iw]? Bạn có chắc chắn rằng kỳ vọng của bạn rằng FullSimplify sẽ làm cho 'đơn giản hóa' này là một kỳ vọng hợp lý? Ngoài ra, suy nghĩ về nó nhiều hơn một chút, tiêu đề câu hỏi của bạn là mâu thuẫn với câu hỏi của bạn. –

+0

Tôi có thể chạy lệnh 'Series' trên' Sqrt' nhưng không chạy trên 'Abs'. – shadesofdarkred

+0

Bạn có thể thử 'ComplexExpand'. Ví dụ 'ComplexExpand [Abs [q + I w]]' tạo 'Sqrt [q^2 + w^2]' – Heike

Trả lời

5

Vấn đề là những gì bạn cho rằng là "Đơn giản" và điều mà MMA cho là đơn giản là hai điều khác nhau. Hãy xem ComplexityFunction chỉ ra rằng MMA chủ yếu xem xét "LeafCount". Áp dụng LeafCount cho:

In[3]:= Abs[q + I w] // LeafCount 
Out[3]= 8 

In[4]:= Sqrt[q^2 + w^2] // LeafCount  
Out[4]= 11 

Vì vậy, MMA coi mẫu Abs là tốt hơn. (Người ta có thể khám phá một cách trực quan sự đơn giản bằng cách sử dụng TreeForm hoặc FullForm). Những gì chúng ta cần làm là nói với MMA để điều trị MMA đắt hơn. Để thực hiện việc này, chúng tôi lấy ví dụ từ ComplexityFunction và viết:

In[7]:= f[e_] := 100 Count[e, _Abs, {0, Infinity}] + LeafCount[e] 
FullSimplify[Abs[q + I w], Element[{q, w}, Reals], 
ComplexityFunction -> f] 

Out[8]= Sqrt[q^2 + w^2] 

Theo yêu cầu. Về cơ bản, chúng tôi đang nói với MMA thông qua f[e] rằng số lượng tất cả các phần của biểu mẫu Abs sẽ được tính là 100 lá.

EDIT: Như đã đề cập bởi Brett, bạn cũng có thể làm cho nó tổng quát hơn, và sử dụng _Complex như quy tắc để tìm kiếm:

In[20]:= f[e_] := 100 Count[e, _Complex, {0, Infinity}] + LeafCount[e] 
FullSimplify[Abs[q + I w], Element[{q, w}, Reals], 
ComplexityFunction -> f] 

Out[21]= Sqrt[q^2 + w^2] 
+0

Đúng, và cũng có ích trong việc tổng quát hơn so với tất cả các số phức. – tkott

4

tôi đề nghị sử dụng ComplexExpand, mà nói với hệ thống mà tất cả các biến là có thật.

In[28]:= Abs[q + I*w] // ComplexExpand 

Out[28]= Sqrt[q^2 + w^2] 
-1

Những nhận xét này không hữu ích. Mathematica không đánh giá được số phức, như trong Abs[5+i20] không thay đổi. Mã số i được mã hóa chính xác. Làm cho các quan sát trừu tượng về 'cái gì là hoặc không đơn giản' không liên quan và sai. Có một phao mà nên kết quả, không phải một số đại số. NImportForm cũng không hoạt động.

+0

chữ thường 'i' là ký hiệu không xác định. Đặt 'I' và sử dụng' N' và bạn sẽ nhận được những gì bạn mong đợi. Tất cả đều không liên quan đến câu hỏi này. – agentp

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