import numpy as np
from scipy.interpolate import interp1d
[docs]def TriangleFun(time, ta, tb):
"""
Triangular Waveform
* time: 1D array for time
* ta: time at peak
* tb: time at step-off
"""
out = np.zeros(time.size)
out[time<=ta] = 1/ta*time[time<=ta]
out[(time>ta)&(time<tb)] = -1/(tb-ta)*(time[(time>ta)&(time<tb)]-tb)
return out
[docs]def TriangleFunDeriv(time, ta, tb):
"""
Derivative of Triangular Waveform
"""
out = np.zeros(time.size)
out[time<=ta] = 1/ta
out[(time>ta)&(time<tb)] = -1/(tb-ta)
return out
[docs]def VTEMFun(time, ta, tb, a):
"""
VTEM Waveform
* time: 1D array for time
* ta: time at peak of exponential part
* tb: time at step-off
"""
out = np.zeros(time.size)
out[time<=ta] = (1-np.exp(-a*time[time<=ta]/ta))/(1-np.exp(-a))
out[(time>ta)&(time<tb)] = -1/(tb-ta)*(time[(time>ta)&(time<tb)]-tb)
return out
[docs]def CausalConv(array1, array2, time):
"""
Evaluate convolution for two causal functions.
Input
* array1: array for \\\\(\\\\ f_1(t)\\\\)
* array2: array for \\\\(\\\\ f_2(t)\\\\)
* time: array for time
.. math::
Out(t) = \int_{0}^{t} f_1(a) f_2(t-a) da
"""
if array1.shape == array2.shape == time.shape:
out = np.convolve(array1, array2)
# print time[1]-time[0]
return out[0:np.size(time)]*(time[1]-time[0])
else:
print "Give me same size of 1D arrays!!"
[docs]def RectFun(time, ta, tb):
"""
Rectangular Waveform
* time: 1D array for time
* ta: time for transition from (+) to (-)
* tb: time at step-off
.. math::
I(t) = 1, 0 < t \le t_a
I(t) = -1, t_a < t < t_b
I(t) = 0, t \le t_a \ \\text{or} \ t \ge t_b
"""
out = np.zeros(time.size)
out[time<=ta] = 1
out[(time>ta)&(time<tb)] = -1
return out
[docs]def CenDiff(f, tin):
"""
Evaluating central difference of given array (f)
and provide funtion handle for interpolation
"""
dfdt = mu_0*np.diff(f, n=1)/np.diff(tin, n=1)
tm = np.diff(tin, n=1)*0.5 + tin[:-1]
Diffun = interp1d(tm, dfdt)
return Diffun