Ho di nuovo un problema con il pacchetto vector-space. Ho ricevuto una risposta molto utile da @mnish in un recente post, ma lì ho affrontato solo una funzione che dipende solo da 1 variabile. cosa succede quando ho, per esempio, una funzione che mappa da coordinate polari a cartesianiDerivati di una funzione multivariata e corrispondente Jacobiano con pacchetto spazio vettoriale
f:(0,oo) x [0,2pi] -> R²
(r,phi) -> (r*cos(phi),r*sin(phi))
che dipende da 2 variabili.
Ho provato questo fuori, con un approccio molto ingenuo:
polar :: Double -> Double -> ((Double,Double) :~> (Double,Double))
polar r phi = \(r,phi) -> (((idD) r)*cos(idD phi),((idD) r)*sin(idD phi))
ottengo il seguente errore:
Couldn't match expected type `(Double, Double) :> (Double, Double)'
with actual type `(t0, t1)'
In the expression:
(((idD) r) * cos (idD phi), ((idD) r) * sin (idD phi))
In the expression:
\ (r, phi)
-> (((idD) r) * cos (idD phi), ((idD) r) * sin (idD phi))
In an equation for `polar':
polar r phi
= \ (r, phi)
-> (((idD) r) * cos (idD phi), ((idD) r) * sin (idD phi))
Per un componente
polarx :: Double -> Double -> ((Double,Double) :~> Double)
polarx r phi = \(r,phi) -> ((idD) r)*cos(idD phi)
ottengo
Couldn't match expected type `Double'
with actual type `(Double, Double)'
Expected type: (Double, Double) :> Double
Actual type: (Double, Double) :> (Double, Double)
In the return type of a call of `idD'
In the first argument of `(*)', namely `((idD) r)'
Apparentemente c'è qualche tipo di disturbo, ma non riesco a capire cosa c'è che non va.
Un'altra domanda sorge quando voglio calcolare lo Jacobiano di tale mappatura. Come suggerisce il nome, ha qualcosa a che fare con le mappe lineari, che è, ovviamente, coperto dal pacchetto, in realtà si basa su quelle mappe. Ma ancora una volta, la mia conoscenza di Haskell è insufficiente, per ricavare una soluzione per conto mio.
Mi sembra di ricordare che un limite chiave dell'elegantissima formulazione di differenziazione automatica di Conal è che funziona solo su derivati lungo un singolo asse. Se vuoi Jacobians, ecc., Penso che il pacchetto pubblicitario di ekmett sia la strada da percorrere: http://hackage.haskell.org/package/ad-1.3.0.1 – sclv
Grazie a @sclv, ho appena esaminato questo modulo e io devo dire, wow, sono impressionato. Non ho notato questo pacchetto e farò un tentativo, grazie per aver segnalato questo – TheMADMAN
Non sei solo - Sto facendo fatica a capire come i vari tipi multidimensionali combaciano. Vado a leggere il documento "Beautiful Differentiation" e spero che faccia luce: il pacchetto pubblicitario sembra un po 'più semplice sui tipi! – Oliver