mirror of
https://github.com/meteoinfo/MeteoInfo.git
synced 2025-12-08 20:36:05 +00:00
update curve_fit function - still is not usable
This commit is contained in:
parent
40a4939f28
commit
09ac878bcc
@ -1,34 +1,34 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<MeteoInfo File="milconfig.xml" Type="configurefile">
|
<MeteoInfo File="milconfig.xml" Type="configurefile">
|
||||||
<Path OpenPath="D:\Temp\HYSPLIT">
|
<Path OpenPath="D:\Working\MIScript\Jython\mis\plot_types\contour">
|
||||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\grads"/>
|
|
||||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\satellite\himawari"/>
|
|
||||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\LaSW"/>
|
|
||||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\meteo\wrf"/>
|
|
||||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\meteo"/>
|
|
||||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\meteo\calc"/>
|
|
||||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\traj"/>
|
|
||||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\traj\TrajStat"/>
|
|
||||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis"/>
|
|
||||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\micaps"/>
|
|
||||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\plot"/>
|
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\plot"/>
|
||||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl"/>
|
|
||||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d"/>
|
|
||||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\no_opengl"/>
|
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\no_opengl"/>
|
||||||
<RecentFolder Folder="D:\Temp\HYSPLIT"/>
|
<RecentFolder Folder="D:\Temp\HYSPLIT"/>
|
||||||
|
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\gui"/>
|
||||||
|
<RecentFolder Folder="D:\MyProgram\java\MeteoInfoDev\toolbox\meteoview3d"/>
|
||||||
|
<RecentFolder Folder="D:\Working\MIScript\Jython\mis"/>
|
||||||
|
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\common_math"/>
|
||||||
|
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\common_math\fitting"/>
|
||||||
|
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\common_math\optimize"/>
|
||||||
|
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\particles"/>
|
||||||
|
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl"/>
|
||||||
|
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\surf"/>
|
||||||
|
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d"/>
|
||||||
|
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types"/>
|
||||||
|
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\contour"/>
|
||||||
</Path>
|
</Path>
|
||||||
<File>
|
<File>
|
||||||
<OpenedFiles>
|
<OpenedFiles>
|
||||||
<OpenedFile File="D:\Working\MIScript\Jython\mis\LaSW\typhoon_map_slice.py"/>
|
<OpenedFile File="D:\Working\MIScript\Jython\mis\LaSW\typhoon_map_slice.py"/>
|
||||||
<OpenedFile File="D:\Working\MIScript\Jython\mis\micaps\micaps_4_8.py"/>
|
<OpenedFile File="D:\MyProgram\java\MeteoInfoDev\toolbox\meteoview3d\mainGUI.py"/>
|
||||||
<OpenedFile File="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\plot\plot3_multi_color_1.py"/>
|
<OpenedFile File="D:\Working\MIScript\Jython\mis\common_math\optimize\curve_fit_2.py"/>
|
||||||
<OpenedFile File="D:\Temp\HYSPLIT\hys_lekima.py"/>
|
<OpenedFile File="D:\Working\MIScript\Jython\mis\plot_types\contour\conout_negtive_value.py"/>
|
||||||
</OpenedFiles>
|
</OpenedFiles>
|
||||||
<RecentFiles>
|
<RecentFiles>
|
||||||
<RecentFile File="D:\Working\MIScript\Jython\mis\LaSW\typhoon_map_slice.py"/>
|
<RecentFile File="D:\Working\MIScript\Jython\mis\LaSW\typhoon_map_slice.py"/>
|
||||||
<RecentFile File="D:\Working\MIScript\Jython\mis\micaps\micaps_4_8.py"/>
|
<RecentFile File="D:\MyProgram\java\MeteoInfoDev\toolbox\meteoview3d\mainGUI.py"/>
|
||||||
<RecentFile File="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\plot\plot3_multi_color_1.py"/>
|
<RecentFile File="D:\Working\MIScript\Jython\mis\common_math\optimize\curve_fit_2.py"/>
|
||||||
<RecentFile File="D:\Temp\HYSPLIT\hys_lekima.py"/>
|
<RecentFile File="D:\Working\MIScript\Jython\mis\plot_types\contour\conout_negtive_value.py"/>
|
||||||
</RecentFiles>
|
</RecentFiles>
|
||||||
</File>
|
</File>
|
||||||
<Font>
|
<Font>
|
||||||
@ -36,5 +36,5 @@
|
|||||||
</Font>
|
</Font>
|
||||||
<LookFeel DockWindowDecorated="true" LafDecorated="true" Name="FlatDarkLaf"/>
|
<LookFeel DockWindowDecorated="true" LafDecorated="true" Name="FlatDarkLaf"/>
|
||||||
<Figure DoubleBuffering="true"/>
|
<Figure DoubleBuffering="true"/>
|
||||||
<Startup MainFormLocation="-7,0" MainFormSize="1342,730"/>
|
<Startup MainFormLocation="-7,-7" MainFormSize="1293,685"/>
|
||||||
</MeteoInfo>
|
</MeteoInfo>
|
||||||
|
|||||||
@ -6,5 +6,6 @@ sys.path.append(toolbox_path)
|
|||||||
sys.path.append(os.path.join(toolbox_path, 'miml_dev'))
|
sys.path.append(os.path.join(toolbox_path, 'miml_dev'))
|
||||||
sys.path.append(os.path.join(toolbox_path, 'EMIPS'))
|
sys.path.append(os.path.join(toolbox_path, 'EMIPS'))
|
||||||
sys.path.append(os.path.join(toolbox_path, 'IMEP'))
|
sys.path.append(os.path.join(toolbox_path, 'IMEP'))
|
||||||
|
sys.path.append(os.path.join(toolbox_path, 'meteoview3d'))
|
||||||
|
|
||||||
mipylib.migl.mifolder = 'D:/MyProgram/Distribution/Java/MeteoInfo/MeteoInfo'
|
mipylib.migl.mifolder = 'D:/MyProgram/Distribution/Java/MeteoInfo/MeteoInfo'
|
||||||
Binary file not shown.
@ -1,4 +1,4 @@
|
|||||||
from .minpack import *
|
from .minpack import *
|
||||||
#from ._lsq import *
|
from ._lsq import *
|
||||||
|
|
||||||
__all__ = [s for s in dir() if not s.startswith('_')]
|
__all__ = [s for s in dir() if not s.startswith('_')]
|
||||||
Binary file not shown.
@ -1,3 +1,3 @@
|
|||||||
from .least_squares import least_squares
|
from .least_squares import least_squares
|
||||||
|
|
||||||
__all__ = ['least_squares', 'lsq_linear']
|
__all__ = ['least_squares']
|
||||||
Binary file not shown.
@ -132,19 +132,62 @@ def curve_fit(f, xdata, ydata, p0=None, sigma=None, absolute_sigma=False,
|
|||||||
n = p0.size
|
n = p0.size
|
||||||
|
|
||||||
func = UniFunc(f)
|
func = UniFunc(f)
|
||||||
jac_func = OptimizeUtil.getJacobianFunction(func, xdata.asarray(), func.order, 5, 0.1)
|
best = OptimizeUtil.curveFit(func, xdata.asarray(), ydata.asarray(), 5, 0.1, p0.tojarray('double'))
|
||||||
problem = LeastSquaresBuilder().start(p0.tojarray('double')). \
|
r = tuple(best)
|
||||||
model(jac_func). \
|
|
||||||
target(ydata.tojarray('double')). \
|
|
||||||
lazyEvaluation(False). \
|
|
||||||
maxEvaluations(1000). \
|
|
||||||
maxIterations(1000). \
|
|
||||||
build()
|
|
||||||
optimum = LevenbergMarquardtOptimizer().optimize(problem)
|
|
||||||
r = tuple(optimum.getPoint().toArray())
|
|
||||||
|
|
||||||
return r
|
return r
|
||||||
|
|
||||||
|
# def curve_fit(f, xdata, ydata, p0=None, sigma=None, absolute_sigma=False,
|
||||||
|
# check_finite=True, bounds=(-np.inf, np.inf), method=None,
|
||||||
|
# jac=None, **kwargs):
|
||||||
|
# """
|
||||||
|
# Use non-linear least squares to fit a function, f, to data.
|
||||||
|
#
|
||||||
|
# Assumes ``ydata = f(xdata, *params) + eps``
|
||||||
|
#
|
||||||
|
# :param f: callable
|
||||||
|
# The model function, f(x, ...). It must take the independent
|
||||||
|
# variable as the first argument and the parameters to fit as
|
||||||
|
# separate remaining arguments.
|
||||||
|
# :param xdata: array_like or object
|
||||||
|
# The independent variable where the data is measured.
|
||||||
|
# Should usually be an M-length sequence or an (k,M)-shaped array for
|
||||||
|
# functions with k predictors, but can actually be any object.
|
||||||
|
# :param ydata: array_like
|
||||||
|
# The dependent data, a length M array - nominally ``f(xdata, ...)``.
|
||||||
|
# :param p0: array_like, optional
|
||||||
|
# Initial guess for the parameters (length N). If None, then the
|
||||||
|
# initial values will all be 1 (if the number of parameters for the
|
||||||
|
# function can be determined using introspection, otherwise a
|
||||||
|
# ValueError is raised).
|
||||||
|
# :return:
|
||||||
|
# """
|
||||||
|
# if p0 is None:
|
||||||
|
# # determine number of parameters by inspecting the function
|
||||||
|
# from ..lib._util import getargspec_no_self as _getargspec
|
||||||
|
# args, varargs, varkw, defaults = _getargspec(f)
|
||||||
|
# if len(args) < 2:
|
||||||
|
# raise ValueError("Unable to determine number of fit parameters.")
|
||||||
|
# n = len(args) - 1
|
||||||
|
# p0 = np.ones(n)
|
||||||
|
# else:
|
||||||
|
# p0 = np.atleast_1d(p0)
|
||||||
|
# n = p0.size
|
||||||
|
#
|
||||||
|
# func = UniFunc(f)
|
||||||
|
# jac_func = OptimizeUtil.getJacobianFunction(func, xdata.asarray(), func.order, 5, 0.1)
|
||||||
|
# problem = LeastSquaresBuilder().start(p0.tojarray('double')). \
|
||||||
|
# model(jac_func). \
|
||||||
|
# target(ydata.tojarray('double')). \
|
||||||
|
# lazyEvaluation(False). \
|
||||||
|
# maxEvaluations(1000). \
|
||||||
|
# maxIterations(1000). \
|
||||||
|
# build()
|
||||||
|
# optimum = LevenbergMarquardtOptimizer().optimize(problem)
|
||||||
|
# r = tuple(optimum.getPoint().toArray())
|
||||||
|
#
|
||||||
|
# return r
|
||||||
|
|
||||||
def _del2(p0, p1, d):
|
def _del2(p0, p1, d):
|
||||||
return p0 - np.square(p1 - p0) / d
|
return p0 - np.square(p1 - p0) / d
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
@ -810,59 +810,7 @@ class Axes3DGL(Axes3D):
|
|||||||
:param cmap: (*string*) Color map string.
|
:param cmap: (*string*) Color map string.
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
warnings.warn("plot_slice is deprecated", DeprecationWarning)
|
return self.slice(*args, **kwargs)
|
||||||
if len(args) <= 3:
|
|
||||||
x = args[0].dimvalue(2)
|
|
||||||
y = args[0].dimvalue(1)
|
|
||||||
z = args[0].dimvalue(0)
|
|
||||||
data = args[0]
|
|
||||||
args = args[1:]
|
|
||||||
else:
|
|
||||||
x = args[0]
|
|
||||||
y = args[1]
|
|
||||||
z = args[2]
|
|
||||||
data = args[3]
|
|
||||||
args = args[4:]
|
|
||||||
if x.ndim == 3:
|
|
||||||
x = x[0,0]
|
|
||||||
if y.ndim == 3:
|
|
||||||
y = y[0,:,0]
|
|
||||||
if z.ndim == 3:
|
|
||||||
z = z[:,0,0]
|
|
||||||
|
|
||||||
cmap = plotutil.getcolormap(**kwargs)
|
|
||||||
if len(args) > 0:
|
|
||||||
level_arg = args[0]
|
|
||||||
if isinstance(level_arg, int):
|
|
||||||
cn = level_arg
|
|
||||||
ls = LegendManage.createLegendScheme(data.min(), data.max(), cn, cmap)
|
|
||||||
else:
|
|
||||||
if isinstance(level_arg, NDArray):
|
|
||||||
level_arg = level_arg.aslist()
|
|
||||||
ls = LegendManage.createLegendScheme(data.min(), data.max(), level_arg, cmap)
|
|
||||||
else:
|
|
||||||
ls = LegendManage.createLegendScheme(data.min(), data.max(), cmap)
|
|
||||||
ls = ls.convertTo(ShapeTypes.POLYGON)
|
|
||||||
edge = kwargs.pop('edge', True)
|
|
||||||
kwargs['edge'] = edge
|
|
||||||
plotutil.setlegendscheme(ls, **kwargs)
|
|
||||||
|
|
||||||
xslice = kwargs.pop('xslice', [])
|
|
||||||
if isinstance(xslice, numbers.Number):
|
|
||||||
xslice = [xslice]
|
|
||||||
yslice = kwargs.pop('yslice', [])
|
|
||||||
if isinstance(yslice, numbers.Number):
|
|
||||||
yslice = [yslice]
|
|
||||||
zslice = kwargs.pop('zslice', [])
|
|
||||||
if isinstance(zslice, numbers.Number):
|
|
||||||
zslice = [zslice]
|
|
||||||
graphics = JOGLUtil.slice(data.asarray(), x.asarray(), y.asarray(), z.asarray(), xslice, \
|
|
||||||
yslice, zslice, ls)
|
|
||||||
visible = kwargs.pop('visible', True)
|
|
||||||
if visible:
|
|
||||||
for gg in graphics:
|
|
||||||
self.add_graphic(gg)
|
|
||||||
return graphics
|
|
||||||
|
|
||||||
def contourslice(self, *args, **kwargs):
|
def contourslice(self, *args, **kwargs):
|
||||||
"""
|
"""
|
||||||
@ -1218,54 +1166,7 @@ class Axes3DGL(Axes3D):
|
|||||||
|
|
||||||
:returns: Legend
|
:returns: Legend
|
||||||
"""
|
"""
|
||||||
warnings.warn("plot_surface is deprecated", DeprecationWarning)
|
return self.surf(*args, **kwargs)
|
||||||
if len(args) <= 2:
|
|
||||||
x = args[0].dimvalue(1)
|
|
||||||
y = args[0].dimvalue(0)
|
|
||||||
x, y = np.meshgrid(x, y)
|
|
||||||
z = args[0]
|
|
||||||
args = args[1:]
|
|
||||||
else:
|
|
||||||
x = args[0]
|
|
||||||
y = args[1]
|
|
||||||
z = args[2]
|
|
||||||
args = args[3:]
|
|
||||||
|
|
||||||
if kwargs.has_key('colors'):
|
|
||||||
cn = len(kwargs['colors'])
|
|
||||||
else:
|
|
||||||
cn = None
|
|
||||||
cmap = plotutil.getcolormap(**kwargs)
|
|
||||||
if len(args) > 0:
|
|
||||||
level_arg = args[0]
|
|
||||||
if isinstance(level_arg, int):
|
|
||||||
cn = level_arg
|
|
||||||
ls = LegendManage.createLegendScheme(z.min(), z.max(), cn, cmap)
|
|
||||||
else:
|
|
||||||
if isinstance(level_arg, NDArray):
|
|
||||||
level_arg = level_arg.aslist()
|
|
||||||
ls = LegendManage.createLegendScheme(z.min(), z.max(), level_arg, cmap)
|
|
||||||
else:
|
|
||||||
if cn is None:
|
|
||||||
ls = LegendManage.createLegendScheme(z.min(), z.max(), cmap)
|
|
||||||
else:
|
|
||||||
ls = LegendManage.createLegendScheme(z.min(), z.max(), cn, cmap)
|
|
||||||
ls = ls.convertTo(ShapeTypes.POLYGON)
|
|
||||||
facecolor = kwargs.pop('facecolor', None)
|
|
||||||
face_interp = None
|
|
||||||
if not facecolor is None:
|
|
||||||
face_interp = (facecolor == 'interp')
|
|
||||||
if not face_interp:
|
|
||||||
if not facecolor in ['flat','texturemap','none']:
|
|
||||||
kwargs['facecolor'] = facecolor
|
|
||||||
plotutil.setlegendscheme(ls, **kwargs)
|
|
||||||
graphics = JOGLUtil.surface(x.asarray(), y.asarray(), z.asarray(), ls)
|
|
||||||
if face_interp:
|
|
||||||
graphics.setFaceInterp(face_interp)
|
|
||||||
visible = kwargs.pop('visible', True)
|
|
||||||
if visible:
|
|
||||||
self.add_graphic(graphics)
|
|
||||||
return graphics
|
|
||||||
|
|
||||||
def isosurface(self, *args, **kwargs):
|
def isosurface(self, *args, **kwargs):
|
||||||
"""
|
"""
|
||||||
@ -1343,54 +1244,7 @@ class Axes3DGL(Axes3D):
|
|||||||
|
|
||||||
:returns: Legend
|
:returns: Legend
|
||||||
"""
|
"""
|
||||||
warnings.warn("plot_isosurface is deprecated", DeprecationWarning)
|
return self.isosurface(*args, **kwargs)
|
||||||
if len(args) <= 3:
|
|
||||||
x = args[0].dimvalue(2)
|
|
||||||
y = args[0].dimvalue(1)
|
|
||||||
z = args[0].dimvalue(0)
|
|
||||||
data = args[0]
|
|
||||||
isovalue = args[1]
|
|
||||||
args = args[2:]
|
|
||||||
else:
|
|
||||||
x = args[0]
|
|
||||||
y = args[1]
|
|
||||||
z = args[2]
|
|
||||||
data = args[3]
|
|
||||||
isovalue = args[4]
|
|
||||||
args = args[5:]
|
|
||||||
cmap = plotutil.getcolormap(**kwargs)
|
|
||||||
cvalue = kwargs.pop('cvalue', None)
|
|
||||||
if not cvalue is None:
|
|
||||||
if len(args) > 0:
|
|
||||||
level_arg = args[0]
|
|
||||||
if isinstance(level_arg, int):
|
|
||||||
cn = level_arg
|
|
||||||
ls = LegendManage.createLegendScheme(data.min(), data.max(), cn, cmap)
|
|
||||||
else:
|
|
||||||
if isinstance(level_arg, NDArray):
|
|
||||||
level_arg = level_arg.aslist()
|
|
||||||
ls = LegendManage.createLegendScheme(data.min(), data.max(), level_arg, cmap)
|
|
||||||
else:
|
|
||||||
ls = LegendManage.createLegendScheme(data.min(), data.max(), cmap)
|
|
||||||
ls = ls.convertTo(ShapeTypes.POLYGON)
|
|
||||||
edge = kwargs.pop('edge', True)
|
|
||||||
kwargs['edge'] = edge
|
|
||||||
plotutil.setlegendscheme(ls, **kwargs)
|
|
||||||
else:
|
|
||||||
ls = plotutil.getlegendbreak('polygon', **kwargs)[0]
|
|
||||||
nthread = kwargs.pop('nthread', None)
|
|
||||||
if nthread is None:
|
|
||||||
graphics = JOGLUtil.isosurface(data.asarray(), x.asarray(), y.asarray(), z.asarray(), isovalue, ls)
|
|
||||||
else:
|
|
||||||
data = data.asarray().copyIfView()
|
|
||||||
x = x.asarray().copyIfView()
|
|
||||||
y = y.asarray().copyIfView()
|
|
||||||
z = z.asarray().copyIfView()
|
|
||||||
graphics = JOGLUtil.isosurface(data, x, y, z, isovalue, ls, nthread)
|
|
||||||
visible = kwargs.pop('visible', True)
|
|
||||||
if visible:
|
|
||||||
self.add_graphic(graphics)
|
|
||||||
return graphics
|
|
||||||
|
|
||||||
def particles(self, *args, **kwargs):
|
def particles(self, *args, **kwargs):
|
||||||
"""
|
"""
|
||||||
@ -1473,51 +1327,7 @@ class Axes3DGL(Axes3D):
|
|||||||
|
|
||||||
:returns: Legend
|
:returns: Legend
|
||||||
"""
|
"""
|
||||||
warnings.warn("plot_particles is deprecated", DeprecationWarning)
|
return self.particles(*args, **kwargs)
|
||||||
if len(args) <= 3:
|
|
||||||
x = args[0].dimvalue(2)
|
|
||||||
y = args[0].dimvalue(1)
|
|
||||||
z = args[0].dimvalue(0)
|
|
||||||
data = args[0]
|
|
||||||
args = args[1:]
|
|
||||||
else:
|
|
||||||
x = args[0]
|
|
||||||
y = args[1]
|
|
||||||
z = args[2]
|
|
||||||
data = args[3]
|
|
||||||
args = args[4:]
|
|
||||||
cmap = plotutil.getcolormap(**kwargs)
|
|
||||||
vmin = kwargs.pop('vmin', data.min())
|
|
||||||
vmax = kwargs.pop('vmax', data.max())
|
|
||||||
if vmin >= vmax:
|
|
||||||
raise ValueError("Minimum value larger than maximum value")
|
|
||||||
|
|
||||||
if len(args) > 0:
|
|
||||||
level_arg = args[0]
|
|
||||||
if isinstance(level_arg, int):
|
|
||||||
cn = level_arg
|
|
||||||
ls = LegendManage.createLegendScheme(vmin, vmax, cn, cmap)
|
|
||||||
else:
|
|
||||||
if isinstance(level_arg, NDArray):
|
|
||||||
level_arg = level_arg.aslist()
|
|
||||||
ls = LegendManage.createLegendScheme(vmin, vmax, level_arg, cmap)
|
|
||||||
else:
|
|
||||||
ls = LegendManage.createLegendScheme(vmin, vmax, cmap)
|
|
||||||
plotutil.setlegendscheme(ls, **kwargs)
|
|
||||||
alpha_min = kwargs.pop('alpha_min', 0.1)
|
|
||||||
alpha_max = kwargs.pop('alpha_max', 0.6)
|
|
||||||
density = kwargs.pop('density', 2)
|
|
||||||
graphics = JOGLUtil.particles(data.asarray(), x.asarray(), y.asarray(), z.asarray(), ls, \
|
|
||||||
alpha_min, alpha_max, density)
|
|
||||||
s = kwargs.pop('s', None)
|
|
||||||
if s is None:
|
|
||||||
s = kwargs.pop('size', None)
|
|
||||||
if not s is None:
|
|
||||||
graphics.setPointSize(s)
|
|
||||||
visible = kwargs.pop('visible', True)
|
|
||||||
if visible:
|
|
||||||
self.add_graphic(graphics)
|
|
||||||
return graphics
|
|
||||||
|
|
||||||
def volumeplot(self, *args, **kwargs):
|
def volumeplot(self, *args, **kwargs):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@ -0,0 +1,57 @@
|
|||||||
|
package org.meteoinfo.math.optimize;
|
||||||
|
|
||||||
|
import org.apache.commons.math3.analysis.ParametricUnivariateFunction;
|
||||||
|
import org.apache.commons.math3.analysis.differentiation.DerivativeStructure;
|
||||||
|
import org.apache.commons.math3.analysis.differentiation.FiniteDifferencesDifferentiator;
|
||||||
|
import org.apache.commons.math3.analysis.differentiation.UnivariateDifferentiableFunction;
|
||||||
|
|
||||||
|
public class MyParametricUnivariateFunction implements ParametricUnivariateFunction {
|
||||||
|
|
||||||
|
private ParamUnivariateFunction function;
|
||||||
|
private int nbPoints;
|
||||||
|
private double stepSize;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
* @param function ParamUnivariateFunction
|
||||||
|
* @param nbPoints Number of points for difference calculation
|
||||||
|
* @param stepSize Step size for difference calculation
|
||||||
|
*/
|
||||||
|
public MyParametricUnivariateFunction(ParamUnivariateFunction function, int nbPoints, double stepSize) {
|
||||||
|
this.function = function;
|
||||||
|
this.nbPoints = nbPoints;
|
||||||
|
this.stepSize = stepSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double value(double v, double... parameters) {
|
||||||
|
function.setParameters(parameters);
|
||||||
|
return function.value(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double[] gradient(double v, double... parameters) {
|
||||||
|
function.setParameters(parameters);
|
||||||
|
|
||||||
|
// create a differentiator
|
||||||
|
FiniteDifferencesDifferentiator differentiator =
|
||||||
|
new FiniteDifferencesDifferentiator(nbPoints, stepSize);
|
||||||
|
|
||||||
|
// create a new function that computes both the value and the derivatives
|
||||||
|
// using DerivativeStructure
|
||||||
|
UnivariateDifferentiableFunction diffFunc = differentiator.differentiate(function);
|
||||||
|
|
||||||
|
double y = function.value(v);
|
||||||
|
int n = parameters.length;
|
||||||
|
double[] gradients = new double[n];
|
||||||
|
for (int i = 0; i < n; i++) {
|
||||||
|
DerivativeStructure xDS = new DerivativeStructure(n, 1, i, parameters[i]);
|
||||||
|
DerivativeStructure yDS = diffFunc.value(xDS);
|
||||||
|
int[] idx = new int[n];
|
||||||
|
idx[i] = 1;
|
||||||
|
gradients[i] = yDS.getPartialDerivative(idx);
|
||||||
|
}
|
||||||
|
|
||||||
|
return gradients;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,9 +1,12 @@
|
|||||||
package org.meteoinfo.math.optimize;
|
package org.meteoinfo.math.optimize;
|
||||||
|
|
||||||
|
import org.apache.commons.math3.analysis.ParametricUnivariateFunction;
|
||||||
import org.apache.commons.math3.analysis.UnivariateFunction;
|
import org.apache.commons.math3.analysis.UnivariateFunction;
|
||||||
import org.apache.commons.math3.analysis.differentiation.DerivativeStructure;
|
import org.apache.commons.math3.analysis.differentiation.DerivativeStructure;
|
||||||
import org.apache.commons.math3.analysis.differentiation.FiniteDifferencesDifferentiator;
|
import org.apache.commons.math3.analysis.differentiation.FiniteDifferencesDifferentiator;
|
||||||
import org.apache.commons.math3.analysis.differentiation.UnivariateDifferentiableFunction;
|
import org.apache.commons.math3.analysis.differentiation.UnivariateDifferentiableFunction;
|
||||||
|
import org.apache.commons.math3.fitting.SimpleCurveFitter;
|
||||||
|
import org.apache.commons.math3.fitting.WeightedObservedPoints;
|
||||||
import org.apache.commons.math3.fitting.leastsquares.MultivariateJacobianFunction;
|
import org.apache.commons.math3.fitting.leastsquares.MultivariateJacobianFunction;
|
||||||
import org.apache.commons.math3.linear.Array2DRowRealMatrix;
|
import org.apache.commons.math3.linear.Array2DRowRealMatrix;
|
||||||
import org.apache.commons.math3.linear.ArrayRealVector;
|
import org.apache.commons.math3.linear.ArrayRealVector;
|
||||||
@ -104,4 +107,31 @@ public class OptimizeUtil {
|
|||||||
|
|
||||||
return jacobianFunc;
|
return jacobianFunc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get curve fitting parameters.
|
||||||
|
* @param func The uni-variate function
|
||||||
|
* @param x X values
|
||||||
|
* @param y Y values
|
||||||
|
* @param nbPoints Number of points for difference calculation
|
||||||
|
* @param stepSize Step size for difference calculation
|
||||||
|
* @param guess Guess values
|
||||||
|
* @return Curve fitting parameters
|
||||||
|
*/
|
||||||
|
public static double[] curveFit(ParamUnivariateFunction func, Array x, Array y,
|
||||||
|
int nbPoints, double stepSize, double[] guess) {
|
||||||
|
ParametricUnivariateFunction function = new MyParametricUnivariateFunction(func, nbPoints, stepSize);
|
||||||
|
SimpleCurveFitter curveFitter = SimpleCurveFitter.create(function, guess);
|
||||||
|
|
||||||
|
IndexIterator xIter = x.getIndexIterator();
|
||||||
|
IndexIterator yIter = y.getIndexIterator();
|
||||||
|
WeightedObservedPoints observedPoints = new WeightedObservedPoints();
|
||||||
|
while (xIter.hasNext()){
|
||||||
|
observedPoints.add(xIter.getDoubleNext(), yIter.getDoubleNext());
|
||||||
|
}
|
||||||
|
|
||||||
|
double[] best = curveFitter.fit(observedPoints.toList());
|
||||||
|
|
||||||
|
return best;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user