Hello, dear friend, you can consult us at any time if you have any questions, add WeChat: THEend8_
ME3255-001 – Computational Mechanics
Outline
1 Finite Differences
2 Richardson Extrapolation
3 Unequally Spaced Data
4 Partial Derivatives
5 NumPy functions
Finite Differences
Recall finite differences:
Derivatives f (n) derived from Taylor series of f at x∗
Forward, backward and central
Error:
Truncation as h increases (from Taylor series)
Roundoff (overflow) as h decreases
Finite Differences for Data with Errors
Caution must be taken when the available data have errors, as finite
difference derivatives are very sensitive to data errors:
Richardson Extrapolation
We can make an improved estimate of the derivative by using Richardson
extrapolation (which we will revisit when studying numerical integration):
Richardson Extrapolation
Specifically, if two finite difference approximations D(h2) and D(h1) with
steps h1 and h2 = h1/2 = h/2 respectively are available, then an improved
estimate of the derivative is given by
D ≈ 4
3
D(h2)− 1
3
D(h1)
Richardson Extrapolation
Example
Using Richardson extrapolation, obtain an improved estimate of f ′(x) at
x = 0.5 for the function
f(x) = −0.1x4 − 0.5x2 − 0.15x3 − 0.25x + 1.2
using centered finite differences with steps h1 = 0.5 and h2 = 0.25. Given
that the exact value is f ′(0.5) = −0.9125, compute the true error.
Unequally Spaced Data
If data are unequally spaced, a common strategy is to use Lagrange
interpolation.
Since we know the form of the Lagrange interpolant, we can directly
differentiate.
Unequally Spaced Data–Example
Example
A temperature gradient can be measured down into
the soil. The heat flux at the soil-air interface can be
computed with Fourier’s law:
q(z = 0) = −kdT
dz
|z=0
where q(z) is the heat flux (W/m 2 ), k is the
coefficient of thermal conductivity of the soil [= 0.5
W/ (m · K)], T is the temperature (K), and z is the
distance measured down from the surface into the
soil (m). Note that a positive value for flux means
that heat is transferred from the air to the soil. Use
numerical differentiation to evaluate the gradient at
the soil-air interface and employ this estimate to
determine the heat flux into the ground.
Partial Derivatives
Consider the definition of partial derivative:
∂f
∂xi
(x1, . . . , xn) := lim
h→0
f(x1, . . . , xi + h, . . . , xn)f(x1, . . . , xi, . . . , xn)
h
Following this definition, we can use finite differences by perturbing
one variable at a time; for example, using centered finite differences:
∂f
∂x
=
f(x + ∆x, y)− f(x−∆x, y)
2∆x
∂f
∂y
=
f(x, y + ∆y)− f(x, y −∆y)
2∆y
Partial Derivatives
Consider the definition of partial derivative:
∂f
∂xi
(x1, . . . , xn) := lim
h→0
f(x1, . . . , xi + h, . . . , xn)f(x1, . . . , xi, . . . , xn)
h
Following this definition, we can use finite differences by perturbing
one variable at a time; for example, using centered finite differences:
∂f
∂x
=
f(x + ∆x, y)− f(x−∆x, y)
2∆x
∂f
∂y
=
f(x, y + ∆y)− f(x, y −∆y)
2∆y
Mixed Partial Derivatives
∂2f
∂x∂y
=
∂
∂x
(
∂f
∂y
)
≈
∂f
∂y (x + ∆x, y)− ∂f∂y (x−∆x, y)
2∆x
=
1
2∆x
[
f(x + ∆x, y + ∆y)− f(x + ∆x, y −∆y)
2∆y
− f(x−∆x, y + ∆y)− f(x−∆x, y −∆y)
2∆y
]
=
1
4∆x∆y
[f(x + ∆x, y + ∆y)− f(x + ∆x, y −∆y)
−f(x−∆x, y + ∆y) + f(x−∆x, y −∆y)]
NumPy functions
numpy.diff(a,n=1, axis=-1) computes the n-th discrete differece
along the given axis of the array a.
numpy.diff example
Example
Use the numpy.diff to differentiate the function
f(x) = 0.2 + 25x− 200x2 + 675x3 − 900x4 + 400x5
NumPy functions
numpy.gradient(f,h) where f is a vector, returns the one-dimensional
numerical gradient of f with spacing between points h.
The gradient is computed using second-order central
differences for interior points, and first- or second-order
one-sided differences at the boundaries.
If f is an N-dimensional array, then the gradient is
computed along each of the dimensions (e.g., rows and
columns for a 2d-array). If h is a single scalar, uniform
spacing is used; h can also be a vector or N-dimensional
array for non-uniform spacing.
numpy.gradient example
Example
1 import numpy as np
2 # 1-d array
3 f = np.array([1, 2, 4, 7, 11, 16], dtype=float)
4 np.gradient(f)
5 np.gradient(f, 2)
6 # 2-d array
7 A = np.array ([[1, 2, 6], [3, 4, 5]], dtype=float)
8 np.gradient(A)