Source code for pygimli.solver.green
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Greens function for some analytical stuff."""
import numpy as np
[docs]
def greenDiffusion1D(x, t=0, a=1, dim=1):
r"""Greens function for diffusion operator.
Provides the elementary solution for:
.. math::
g(x,t) = \partial t + a \Delta
To find a solution for:
.. math::
u(x,t) \quad\text{for}\quad\frac{\partial u(x,t)}{\partial t} +
a \Delta u(x,t) = f(x)
.. math:: x = [-x, 0, x]
.. math:: u(x,t) = g(x,t) * f(x)
Parameters
----------
x : array_like
Discrete spatial coordinates. Should better be symmetric [-x, 0, x].
t : float
Time
a : float, optional
Scale for Laplacian operator
dim : int, optional
Spatial dimension [1]
Returns
-------
g : array_like
Discrete Greens'function
Examples
--------
>>> import numpy as np
>>> from pygimli.solver import greenDiffusion1D
>>> dx = 0.001
>>> x = np.arange(0, 0.1+dx, dx)
>>> g = greenDiffusion1D(np.hstack((-x[:0:-1], x)), t=1.0, a=1e-4)
>>> g *= dx
>>> f = np.zeros(len(x))
>>> f[int(len(x)/2)] = 1.
>>> u = np.convolve(g, f)[len(x)-1:2*len(x)-1]
>>> import matplotlib.pyplot as plt
>>> fig, ax = plt.subplots()
>>> _ = ax.plot(x, u, label="u(x)")
>>> _ = ax.plot(x, g[::2], label="g(x)")
>>> _ = ax.legend()
>>> fig.show()
"""
return 1. / (4. * np.pi * a * t)**(dim / 2.0) * \
np.exp(-(x**2) / (4. * a * t))