|
1 | 1 |
|
2 | 2 | {-# LANGUAGE TypeOperators #-} |
| 3 | +{-# LANGUAGE MultiParamTypeClasses #-} |
| 4 | +{-# LANGUAGE FlexibleInstances #-} |
3 | 5 |
|
4 | 6 | module Combination.Combination |
5 | 7 | ( |
6 | 8 | ) where |
7 | 9 |
|
8 | | -import Vector.Vector |
9 | | -import Calculus.FunExpr |
10 | | -import Calculus.DifferentialCalc |
11 | | -import Calculus.IntegralCalc |
| 10 | +import Vector.Vector2 |
| 11 | +--import Calculus.FunExpr |
| 12 | +--import Calculus.DifferentialCalc |
| 13 | +--import Calculus.IntegralCalc |
12 | 14 | import Dimensions.Quantity2 |
13 | 15 | import Dimensions.TypeLevel |
| 16 | +import qualified Dimensions.ValueLevel as V |
14 | 17 | import Prelude hiding (length) |
15 | 18 |
|
16 | 19 | -- Calculus i Dimensions |
17 | 20 | ------------------------ |
18 | 21 |
|
| 22 | +{- |
| 23 | +
|
19 | 24 | instance Fractional FunExpr where |
20 | 25 | fromRational = Const . fromRational |
21 | 26 | (/) = (:/) |
@@ -81,63 +86,103 @@ differentiateWRTtime qc = fmap simplify $ fmap derive qc /# time |
81 | 86 | integrateWRTtime :: QC d -> QC (d `Mul` Time) |
82 | 87 | integrateWRTtime qc = fmap simplify $ fmap integrate qc *# time |
83 | 88 |
|
| 89 | +-} |
| 90 | + |
| 91 | + |
| 92 | +-------------------- |
84 | 93 | -- Calc i Vec i Quan |
85 | 94 | -------------------- |
86 | 95 |
|
87 | | -type QVC d = Quantity d (Vector2 FunExpr) |
| 96 | +----------------------- |
| 97 | +-- Instansiering |
| 98 | + |
| 99 | +-- En vektor kan adderas |
88 | 100 |
|
89 | | -anyVal :: Vector2 FunExpr |
90 | | -anyVal = V2 (Const 1) (Const 1) |
| 101 | +-- (Kan alla göras samtidigt?) |
91 | 102 |
|
92 | | -lengthQVC = length' anyVal |
93 | | -massQVC = mass' anyVal |
94 | | -timeQVC = time' anyVal |
95 | | -temperatureQVC = temperature' anyVal |
96 | | -currentQVC = current' anyVal |
97 | | -substanceQVC = substance' anyVal |
98 | | -luminosityQVC = luminosity' anyVal |
99 | | -oneQVC = one' anyVal |
| 103 | +instance (Addable v v v) => Addable (Vector2 v) (Vector2 v) (Vector2 v) where |
| 104 | + doAdd = vzipWith (doAdd) |
| 105 | +instance (Addable v v v) => Addable (Vector3 v) (Vector3 v) (Vector3 v) where |
| 106 | + doAdd = vzipWith (doAdd) |
100 | 107 |
|
101 | | -s1 :: QVC Length |
102 | | -s1 = V2 (5 :+ Id) (2 :* Id) ## lengthQVC |
| 108 | +-- En vektor kan multipliceras på flera sätt |
103 | 109 |
|
104 | | -s2 :: QVC Time |
105 | | -s2 = V2 (Id :* Id) (8) ## timeQVC |
| 110 | +-- Skalning (från vänster) |
| 111 | +instance (Num v) => Multiplicable v (Vector2 v) (Vector2 v) where |
| 112 | + doMult = scale |
| 113 | +instance (Num v) => Multiplicable v (Vector3 v) (Vector3 v) where |
| 114 | + doMult = scale |
106 | 115 |
|
107 | | --- Socker |
108 | | -(###) :: (FunExpr, FunExpr) -> QVC d -> QVC d |
109 | | -(x, y) ### qvc = V2 x y ## qvc |
| 116 | +-- Kryssprdoukt |
| 117 | +instance (Num v) => Multiplicable (Vector3 v) (Vector3 v) (Vector3 v) where |
| 118 | + doMult = crossProd |
110 | 119 |
|
111 | | -s3 :: QVC Time |
112 | | -s3 = (Id, Sin) ### timeQVC |
| 120 | +-- Skalärprodukt |
| 121 | +instance (Num v) => Multiplicable (Vector2 v) (Vector2 v) v where |
| 122 | + doMult = dotProd |
| 123 | +instance (Num v) => Multiplicable (Vector3 v) (Vector3 v) v where |
| 124 | + doMult = dotProd |
113 | 125 |
|
114 | | -addQVC :: QVC d -> QVC d -> QVC d |
115 | | -addQVC = quantityAdd' (vzipWith (+)) |
| 126 | +-- En vektor kan "skapas" |
116 | 127 |
|
117 | | -simplifyQVC :: QVC d -> QVC d |
118 | | -simplifyQVC = fmap (vmap simplify) |
| 128 | +instance (Creatable v) => Creatable (Vector2 v) where |
| 129 | + anyVal = V2 anyVal anyVal |
| 130 | +instance (Creatable v) => Creatable (Vector3 v) where |
| 131 | + anyVal = V3 anyVal anyVal anyVal |
119 | 132 |
|
120 | | -scaleQVC :: Quantity d1 FunExpr -> QVC d2 -> QVC (d1 `Mul` d2) |
121 | | -scaleQVC s qvc = simplifyQVC $ quantityMul' (\fe vec -> scale fe vec) s qvc |
| 133 | +------------------------------------ |
| 134 | +-- Användning |
122 | 135 |
|
123 | | -divQVC :: Quantity d1 FunExpr -> QVC d2 -> QVC (d1 `Div` d2) |
124 | | -divQVC s qvc = simplifyQVC $ quantityDiv' (\fe vec -> scale (1 :/ fe) vec) s qvc |
| 136 | +-- Ej dimensionssäkra |
| 137 | +v1 :: Vector3 Double |
| 138 | +v1 = V3 3 2 3 |
| 139 | +v2 :: Vector3 Double |
| 140 | +v2 = V3 1 2 5 |
| 141 | +v3 :: Vector3 Double |
| 142 | +v3 = V3 7 8 2 |
125 | 143 |
|
126 | | -diffQVC :: QVC d -> QVC (d `Div` Time) |
127 | | -diffQVC qvc = simplifyQVC differentiated |
| 144 | +-- Dimensionsäkra |
| 145 | +v1d :: Quantity Length (Vector3 Double) |
| 146 | +v1d = v1 ## length |
| 147 | +v2d :: Quantity Mass (Vector3 Double) |
| 148 | +v2d = v2 ## mass |
| 149 | +v3d :: Quantity Time (Vector3 Double) |
| 150 | +v3d = v3 ## time |
| 151 | + |
| 152 | +-- t1 kräver typsignatur, antagligen för den här MultiParam... |
| 153 | +-- så att ska veta vilken instans |
| 154 | + |
| 155 | +-- Addition |
| 156 | +t1 :: Quantity Length (Vector3 Double) |
| 157 | +t1 = v1d +# v1d |
| 158 | + |
| 159 | +-- Kryssprodukt |
| 160 | +t2 :: Quantity (Length `Mul` Mass) (Vector3 Double) |
| 161 | +t2 = v1d *# v2d |
| 162 | + |
| 163 | +-- Skalning |
| 164 | +t3 :: Quantity (Length `Mul` Mass) (Vector3 Double) |
| 165 | +t3 = s *# v2d |
128 | 166 | where |
129 | | - differentiated = quantityDiv' f (fmap (vmap derive) qvc) timeQVC |
130 | | - f = vzipWith (/) |
| 167 | + s :: Quantity Length Double |
| 168 | + s = 3.0 ## length |
| 169 | + |
| 170 | +-- Skalärprodukt |
| 171 | +t4 :: Quantity (Time `Mul` Length) Double |
| 172 | +t4 = v3d *# v1d |
| 173 | + |
| 174 | + |
| 175 | + |
| 176 | + |
| 177 | + |
| 178 | + |
| 179 | + |
| 180 | + |
| 181 | + |
131 | 182 |
|
132 | | --- Ett flygplans position av tiden bestäms av nedan |
133 | 183 |
|
134 | | -pos :: QVC Length |
135 | | -pos = (Sin :+ Const 8, Id :* Const 3) ### lengthQVC |
136 | 184 |
|
137 | | --- Vad är hastigheten hos ett flygplan som flyger dubbelt så snabbt, som en funktion av tiden? |
138 | 185 |
|
139 | | -velDoub :: QVC (Length `Div` Time) |
140 | | -velDoub = scaleQVC (Const 2 # one) (diffQVC pos) |
141 | 186 |
|
142 | 187 |
|
143 | 188 |
|
|
0 commit comments