2012-03-07 10 views
5

pomocą kodu FullSimplify[Abs[q + I*w], Element[{q, w}, Reals]] wyników wMathematica nie obliczać wartości bezwzględnej liczby zespolonej o współczynnikach rzeczywistych

Abs[q + I w] 

i nie

Sqrt[q^2 + w^2] 

Co mi brakuje?

P.S. Assuming[{q \[Element] Reals, w \[Element] Reals}, Abs[q + I*w]] też nie działa. Uwaga: praca: Simplify[Abs[w]^2, Element[{q, w}, Reals]] i Simplify[Abs[I*q]^2, Element[{q, w}, Reals]].

+0

Nie jestem teraz na moim komputerze Mathematica, więc nie mogę przetestować niczego, ale mam dla ciebie pytanie. W jakim sensie Sqrt [q^2 + w^2] jest prostszy od Abs [q + Iw]? Czy jesteś pewien, że twoje oczekiwanie, że FullSimplify zrobi to "uproszczenie", jest rozsądnym oczekiwaniem? Ponadto, myśląc o tym nieco więcej, tytuł twojego pytania jest sprzeczny z twoim pytaniem. –

+0

Mogę uruchomić polecenie 'Series' na' Sqrt', ale nie na 'Abs'. – shadesofdarkred

+0

Możesz wypróbować 'ComplexExpand'. Na przykład 'ComplexExpand [Abs [q + I w]]' tworzy 'Sqrt [q^2 + w^2]' – Heike

Odpowiedz

5

Problem polega na tym, że to, co zakładamy jako "proste" i co MMA zakłada, że ​​jest proste, to dwie różne rzeczy. Patrząc na ComplexityFunction wskazuje, że MMA przede wszystkim patrzy na "LeafCount". Stosując LeafCount daje:

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

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

Więc MMA uważa formularz Abs być lepiej. (Można wizualnie zbadać prostotę za pomocą TreeForm lub FullForm). To, co musimy zrobić, to powiedzieć MMA, aby traktować MMA jako droższą. Aby to zrobić, bierzemy przykład z ComplexityFunction i napisać:

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] 

na żądanie. Zasadniczo mówimy MMA poprzez f[e], że liczba wszystkich części formularza Abs powinna być liczona jako 100 liści.

EDIT: Jak wspomniano przez Brett, można też uczynić go bardziej ogólny i używać _Complex jako zasada szukać:

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

Prawda, a także jest korzystniejsza w byciu bardziej ogólną wobec wszystkich liczb zespolonych. – tkott

4

Moim przy użyciu ComplexExpand, który informuje system, że wszystkie zmienne są prawdziwe.

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

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

Te komentarze nie są pomocne. Mathematica nie potrafi oszacować liczby zespolonej, ponieważ w wersji Abs[5+i20] pozostaje niezmieniona. Kod i został poprawnie zakodowany. Dokonywanie abstrakcyjnych spostrzeżeń na temat tego, co jest "proste, a co nie jest proste", jest niepowiązane i błędne. Powinien powstać spławik, a nie jakaś algebra. N i ImportForm również nie działają.

+0

Małe litery "i" są niezdefiniowanymi symbolami. Wpisz 'I' i użyj' N', a otrzymasz to, czego się spodziewasz. Wszystko niezwiązane z tym pytaniem. – agentp

Powiązane problemy