Numeri complessi di pattern matching come a + bi

Sep 13 2020

Ho appena iniziato a lavorare con Mathematica e sto giocando con il pattern matching. Potrebbe esserci qualcosa di ovvio che mi manca in questo, ma non riesco a capirlo da solo.

Voglio scrivere una funzione che accetta un numero complesso come argomenti. Quindi f[1 + 2 I]dovrebbe essere un input valido, così come f[a + b I]. Voglio, tuttavia, che la mia funzione lo analizzi come due numeri del modulo a + bi, ottenendo ae bper corrispondenza del modello. Ho fatto diversi tentativi simili a questo:

f[a_ + b_ I] := NSolve[a^2 + b^2 == 1/2 (1 + z), z]
SetAttributes[f, HoldAll]

(Immagino che NSolve non abbia importanza in questo caso, ma lascialo lì nel caso in cui faccia parte del problema.)

Non funziona come avevo pianificato. Qualsiasi tentativo di chiamarlo, come f[1 + 2 I], fa semplicemente eco a se stesso, ma funziona bene quando lo chiamo con argomenti simbolici, come f[a + b I].

Immaginavo che ciò dovesse essere dovuto a qualche differenza nella rappresentazione interna di espressioni simboliche e numeri complessi. In effetti, ogni volta che ci provo MatchQ[m + n I, a_ + b_ I], dice che è vero. Ma quando provo il tipo di MatchQ[Unevaluated[2 + 3 I], a_ + b_ I], è falso.

Nel cercare di capirlo, ho chiesto

FullForm[a + b I]
FullForm[Unevaluated[2 + 3 I]]
FullForm[a_ + b_ I]

e ottenuto

Plus[a,Times[Complex[0,1],b]]
Unevaluated[Plus[2,Times[3,\[ImaginaryI]]]]
Plus[Pattern[a,Blank[]],Times[Complex[0,1],Pattern[b,Blank[]]]]

Le mie domande sono:

  1. Non dovrebbe la Plus[2,Times[3,\[ImaginaryI]]]partita con Plus[Pattern[a,Blank[]],Times[Complex[0,1],Pattern[b,Blank[]]]]?
  2. Qual'è la differenza tra \[ImaginaryI]e Complex[0,1]? So che il primo è un simbolo tanto quanto lo \[Alpha]è, e immagino che chiedendo Unevaluated impedisca che venga lanciato come a Complex[0,1]. Probabilmente questo sarebbe necessario per l'abbinamento, ma non conosco una soluzione alternativa.
  3. C'è un modo migliore per fare ciò che sto tentando con la mia funzione?

Grazie!

Risposte

5 eyorble Sep 12 2020 at 23:51
f[a_. + b_ I | Complex[a_, b_]] := {a, b}

È necessario catturare sia la forma non valutata per il lavoro simbolico che la Complexrappresentazione valutata per il lavoro numerico. Si noti che il primo a_.consente di omettere la parte reale in modo che anche le parti puramente immaginarie possano essere abbinate.

Nota che questo potrebbe non funzionare su forme polinomiali sufficientemente complicate, ma non è esploso negli esempi che ho provato.