- Derivatives of a multivariative function and corresponding Jacobian with vector-space package
- f:(0,oo) x [0,2pi] -> R²
- (r,phi) -> (r*cos(phi),r*sin(phi))
- polar :: Double -> Double -> ((Double,Double) :~> (Double,Double))
- polar r phi = (r,phi) -> (((idD) r)*cos( idD phi),((idD) r)*sin( idD phi))
- 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))
- polarx :: Double -> Double -> ((Double,Double) :~> Double)
- polarx r phi = (r,phi) -> ((idD) r)*cos( idD phi)
- 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)'
- polarCoordD :: ((Double,Double) :~> (Double,Double))
- polarCoordD = (r,phi) -> pairD (polarx (r,phi), polary (r,phi))
- where polarx :: (Double,Double) :~> Double
- polarx = (r,phi) -> (fst . unpairD $ (idD) (r,phi))*cos( snd . unpairD $ idD (r, phi))
- polary :: (Double,Double) :~> Double
- polary = (r,phi) -> (fst . unpairD $ (idD) (r,phi))*sin( snd . unpairD $ idD (r, phi))
- cylCoordD :: (Vec3 Double :~> Vec3 Double)
- cylCoordD = (r,phi,z) -> tripleD (cylx (r,phi,z), cyly (r,phi,z),cylz (0,0,z))
- where cylx :: (Double,Double,Double) :~> Double
- cylx = (r,phi,z) -> (fst' . untripleD $ (idD) (r,phi,z))*cos( snd' . untripleD $ idD (r, phi,z))
- cyly :: (Double,Double,Double) :~> Double
- cyly = (r,phi,z) -> (fst' . untripleD $ (idD) (r,phi,z))*sin( snd' . untripleD $ idD (r, phi,z))
- cylz :: (Double,Double,Double) :~> Double
- cylz = (_,_,z) -> third . untripleD $ idD (0,0,z)
- fst' :: (a,b,c) -> a
- fst' (x,_,_) = x
- snd' :: (a,b,c) -> b
- snd' (_,y,_) = y
- third :: (a,b,c) -> c
- third (_,_,z) = z
- let transmat = (r,phi,z) -> powVal $ liftD3 (,,) (normalized $ derivAtBasis (cylCoordD (r,phi,z)) (Left ())) (normalized $ derivAtBasis (cylCoordD (r,phi,z)) (Right (Left ()))) (normalized $ derivAtBasis (cylCoordD (r,phi,z)) (Right (Right ())))
- *Main> transmat (2, rad 0, 0)
- ((1.0,0.0,0.0),(0.0,1.0,0.0),(0.0,0.0,1.0))
- *Main> transmat (2, rad 90, 0)
- ((6.123233995736766e-17,1.0,0.0),(-1.0,6.123233995736766e-17,0.0),(0.0,0.0,1.0))
- rad :: Double -> Double
- rad = (pi*) . (*recip 180)