2012-03-07 4 views
5

Utilizzando il codice FullSimplify[Abs[q + I*w], Element[{q, w}, Reals]] risultati inMathematica non calcola i valori assoluti di un numero complesso con coefficienti reali

Abs[q + I w] 

e non

Sqrt[q^2 + w^2] 

Che cosa mi manca?

P.S. Assuming[{q \[Element] Reals, w \[Element] Reals}, Abs[q + I*w]] non funziona neanche. Nota: Simplify[Abs[w]^2, Element[{q, w}, Reals]] e Simplify[Abs[I*q]^2, Element[{q, w}, Reals]] lavoro.

+0

Al momento non sono alla mia macchina Mathematica quindi non posso testare nulla ma ho una domanda per te. In che senso è Sqrt [q^2 + w^2] più semplice di Abs [q + Iw]? Sei sicuro che la tua aspettativa che FullSimplify faccia questa 'semplificazione' è un'aspettativa ragionevole? Inoltre, pensandoci un po 'di più, il titolo della tua domanda è in disaccordo con la tua domanda. –

+0

Posso eseguire il comando 'Series' su' Sqrt' ma non su 'Abs'. – shadesofdarkred

+0

Si potrebbe provare 'ComplexExpand'. Ad esempio 'ComplexExpand [Abs [q + I w]]' produce 'Sqrt [q^2 + w^2]' – Heike

risposta

5

Il problema è che ciò che si presuppone sia "Semplice" e che l'MMA presuppone siano semplici sono due cose diverse. Dando uno sguardo a ComplexityFunction indica che MMA guarda principalmente a "LeafCount". Applicando LeafCount dà:

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

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

Quindi, MMA considera la forma Abs di essere migliore. (Si può esplorare visivamente la semplicità usando TreeForm o FullForm). Quello che dobbiamo fare è dire a MMA di trattare gli MMA come più costosi. Per fare questo, prendiamo l'esempio da ComplexityFunction e scrittura:

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] 

come richiesto. Fondamentalmente, stiamo comunicando all'MMA tramite f[e] che il conteggio di tutte le parti del modulo Abs dovrebbe essere pari a 100 foglie.

EDIT: Come già detto da Brett, si può anche rendere più generale, e utilizzare _Complex come la regola per cercare:

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

Vero, ed è anche utile per essere più generale contro tutti i numeri complessi. – tkott

4

Io suggerisco di usare ComplexExpand, che dice al sistema che tutte le variabili sono reali

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

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

Questi commenti non sono utili. Mathematica non riesce a valutare numeri complessi, poiché in Abs[5+i20] è rimasto invariato. i è codificato correttamente. Fare osservazioni astratte su "ciò che è o non è semplice" non è correlato e sbagliato. C'è un float che dovrebbe risultare, non un po 'di algebra. N e ImportForm non funzionano, neanche.

+0

minuscolo 'i' è un simbolo non definito. Metti "I" e usa "N" e otterrai ciò che ti aspetti. Tutto non correlato a questa domanda. – agentp