Source code for openalea.hydroroot.length
import numpy as np
from scipy.interpolate import UnivariateSpline
from .read_file import readCSVFile
[docs]
def fit_length(csvdata, length='1e-4', k=1, s=0.):
"""Fit a 1D spline from (x, y) csv extracted data.
Retrieve the values it will be applied to from the prop_in of the MTG.
And evaluate the spline to compute the property 'prop_out'
:param csvdata:
:param length: number dividing data if > 0 (Default value = '1e-4')
:param k: (int) - degree of the smoothing spline (Default value = 1)
:param s: (float) - positive smoothing factor used to choose the number of knots (Default value = 0)
:return:
- spline object
"""
length = float(length)
if isinstance(csvdata, str):
csvdata = readCSVFile(csvdata)
x_name = csvdata.dtype.names[0]
y_name = csvdata.dtype.names[1]
return fit_law(csvdata[x_name], csvdata[y_name], scale=length, k=k, s=s)
[docs]
def fit_law(x, y, scale=0., k=1, s=0, **kwds):
"""
Return a spline interpolation of y(x)
:param x: (float list)
:param y: (float list)
:param scale: (float) - number dividing x and y if > 0 (Default value = 0.)
:param k: (int) - degree of the smoothing spline (Default value = 1)
:param s: (float) - positive smoothing factor used to choose the number of knots (Default value = 0)
:param kwds: additional arguments see scipy doc of UnivariateSpline
:return:
- spline object
"""
if scale:
x = list(np.array(x) / scale)
y = list(np.array(y) / scale)
#print "DEBUG: ", scale, x, y
spline = UnivariateSpline(x, y, k=k, s=s, **kwds)
return spline
[docs]
def diff(law1, ref_law):
"""
deprecated
Calculate the difference between the inetgrale of the two laws
:param law1: scipy spline object
:param ref_law: scipy spline object
"""
knots = law1.get_knots()
interval_def = (knots[0], knots[-1])
integral1 = law1.integral(*interval_def)
integral_ref = ref_law.integral(*interval_def)
return integral1-integral_ref