Skip to content

Commit 97b0b04

Browse files
author
Oskar Lundström
committed
Skrev om vektorer i resultat
1 parent f1de439 commit 97b0b04

File tree

1 file changed

+50
-7
lines changed

1 file changed

+50
-7
lines changed

Rapport/include/Resultat.tex

Lines changed: 50 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -179,8 +179,6 @@ \subsection{Dimensioner}
179179

180180
\subsection{Matematisk analys}
181181

182-
\begin{binge}
183-
184182
I kapitlet om matematisk analys skapas en syntax för funktionsuttryck och symboliskt derivering och integrering implementeras. Dessutom analyseras syntax och semantik hos uttryck som dyker upp inom matematisk analys, till exempel $\Delta$-operatorn.
185183

186184
Syntaxen för funktionsuttryck inleds med
@@ -224,13 +222,58 @@ \subsection{Matematisk analys}
224222
derive Exp = Exp
225223
\end{lstlisting}
226224

227-
\end{binge}
228-
229225
\subsection{Vektorer}
230226

231-
Vektorer implementerades på två olika sätt. Det första följde definitionen i
232-
kurboken och implementerade vektorer i två dimensioner med en typ vars
233-
konstruktor tog två argument.
227+
Kapitlet om vektorer inleds med en genomgång av vektorer och operationer på dem parallellt med att en första implementation till dem skrivs. Implementation ser ut som följer
228+
229+
\begin{lstlisting}
230+
data Vector2 n = V2 n n
231+
type Scalar = Double
232+
type VectorTwo = Vector2 Scalar
233+
234+
magnitude :: VectorTwo -> Scalar
235+
magnitude (V2 x y) = sqrt (x^2 + y^2)
236+
237+
add :: VectorTwo -> VectorTwo -> VectorTwo
238+
add (V2 x1 y1) (V2 x2 y2) = V2 (x1 + x2) (y1 + y2)
239+
240+
dotProd :: VectorTwo -> VectorTwo -> Scalar
241+
dotProd (V2 ax ay) (V2 bx by) = ax * bx + ay * by
242+
\end{lstlisting}
243+
244+
Eftersom vektorer i tre dimensioner ser snarlik ut leder det till väldigt mycket duplicerad kod. En andra implementation görs därför som är mer generell. Grunden är den nedanstående typklassen
245+
246+
\begin{lstlisting}
247+
class Vector vector where
248+
vmap :: (n -> n) -> vector n -> vector n
249+
vzipWith :: (n -> n -> n) -> vector n -> vector n
250+
-> vector n
251+
vfold :: (n -> n -> n) -> vector n -> n
252+
\end{lstlisting}
253+
254+
som innehåller de tre funktioner som behövs för att genomföra vektoroperationerna \texttt{magnitude}, \texttt{add} och \texttt{dotProd}. De kan nämligen skrivas om enbart med hjälp av de funktioner som finns i typklassen \texttt{Vector} på följande sätt
255+
256+
\begin{lstlisting}
257+
magnitude :: (Floating n, Vector vec) => vec n -> n
258+
magnitude = sqrt . vfold (+) . vmap (**2)
259+
260+
add :: (Num n, Vector vec) => vec n -> vec n -> vec n
261+
add = vzipWith (+)
262+
263+
dotProd :: (Num n, Vector vec) => vec n -> vec n -> n
264+
dotProd v1 v2 = vfold (+) $ vzipWith (*) v1 v2
265+
\end{lstlisting}
266+
267+
Allt som behöver göras för vardera datatyp för vektorer av olika längd är därmed att göra den en \texttt{Vector}-instans. Så här ser det ut för \texttt{Vector2}
268+
269+
\begin{lstlisting}
270+
instance Vector Vector2 where
271+
vmap f (V2 x y) = V2 (f x) (f y)
272+
vzipWith f (V2 x y) (V2 x' y') = V2 (f x x') (f y y')
273+
vfold f (V2 x y) = f x y
274+
\end{lstlisting}
275+
276+
Resterande del av vektor-kapitlet behandlar kryssprodukt, vektorlagar och tester av dem.
234277

235278
\subsection{Exempelproblem}
236279

0 commit comments

Comments
 (0)