| 1234567891011121314151617181920212223242526272829303132333435363738394041 |
- -- 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
|