|
|
@@ -0,0 +1,41 @@
|
|
|
+-- Exercise 4.2
|
|
|
+-- George C. Privon
|
|
|
+-- 2023-12-22
|
|
|
+type R = Double
|
|
|
+type Derivative = (R -> R) -> R -> R
|
|
|
+
|
|
|
+-- a function to take the numerical derivative, approximated for some dt
|
|
|
+derivative :: R -> Derivative
|
|
|
+derivative dt x t = (x (t + dt/2) - x (t - dt/2)) / dt
|
|
|
+
|
|
|
+-- the function we want to take the derivative of
|
|
|
+myfunc :: R -> R
|
|
|
+myfunc x = x**3
|
|
|
+
|
|
|
+-- exact derivative of our function of interest
|
|
|
+dmyfunc :: R -> R
|
|
|
+dmyfunc x = 3 * x**2
|
|
|
+
|
|
|
+-- take the derivative with dt=1
|
|
|
+dOne :: R -> R
|
|
|
+dOne x = derivative 1 myfunc x
|
|
|
+
|
|
|
+-- compare the exact derivative with the numerical derivative using dt=1
|
|
|
+abserr :: R -> R
|
|
|
+abserr x = abs (dmyfunc x - dOne x)
|
|
|
+
|
|
|
+-- compare the exact derivative with the numerical derivative, for a fixed
|
|
|
+-- value, varying the dt
|
|
|
+abserrdt :: R -> R
|
|
|
+abserrdt dt = abs (dmyfunc 0.1 - derivative dt myfunc 0.1)
|
|
|
+
|
|
|
+
|
|
|
+-- Solution discussion
|
|
|
+-- a) The error introduced by the numerical derivative is a constant value of
|
|
|
+-- 0.25.
|
|
|
+-- b) The error in terms of `dt` (a in the variables of the example) follows
|
|
|
+-- 0.25*dt**2
|
|
|
+-- c) When x=4, a fractional error of 1% can be achieved with a
|
|
|
+-- dt=sqrt(0.01*48/0.25)~1.3856406460551018.
|
|
|
+-- When x=0.1, the same fractional error can be achieved with:
|
|
|
+-- dt=sqrt(0.01*0.03/0.25)~3.4641016151377546e-2
|