Exemplo n.º 1
0
        public static IKrigingModel selectModel(KrigingModelType value)
        {
            IKrigingModel model;

            switch (value)
            {
            case KrigingModelType.circular:
                model = new ModelCircular();
                break;

            case KrigingModelType.exponential:
                model = new ModelExponential();
                break;

            case KrigingModelType.gaussian:
                model = new ModelGaussian();
                break;

            case KrigingModelType.linear:
                model = new ModelLineal();
                break;

            case KrigingModelType.spherical:
                model = new ModelSpherical();
                break;

            default:
                model = new ModelExponential();
                break;
            }
            return(model);
        }
Exemplo n.º 2
0
 public IKrigingModel setFunction(KrigingModelType model, double sill, double range, double nugget)
 {
     _krigingModel        = selectModel(model);
     _krigingModel.Nugget = nugget;
     _krigingModel.Sill   = sill;
     _krigingModel.Range  = range;
     onChangedKriginParameter(EventArgs.Empty);
     return(_krigingModel);
 }
Exemplo n.º 3
0
 public IKrigingModel getFunctionDefault(KrigingModelType model)
 {
     return(getFunction(model, _spatial.getSemivarianceStatistic().Mean,
                        _spatial.getLag().lagSize *_spatial.getLag().numLags / 2, 0));
 }
Exemplo n.º 4
0
        public IKrigingModel getFunction(KrigingModelType model, double sill, double range, double nugget)
        {
            _msill    = new Parameter(sill);
            _mrange   = new Parameter(range);
            _mnugget  = new Parameter(nugget);
            _distance = new Parameter();


            // Parameter[] regressionParameters=null;
            //  Parameter[] observedParameters = null; ;
            _observedParameters = new[] { _distance };
            // regressionParameters = new Parameter[] { mrange, msill,mnugget };
            defineParametersCalculation();
            switch (model)
            {
            case KrigingModelType.circular:
                _krigingModel       = new ModelCircular();
                _regressionFunction = () =>
                                      _distance > 0 && _distance <= Math.Abs(_mrange)
                            ? _mnugget +
                                      (((2 * Math.Abs(_msill)) / Math.PI) *
                                       (((_distance / Math.Abs(_mrange)) *
                                         Math.Sqrt(1 - ((_distance * _distance) / (Math.Abs(_mrange) * Math.Abs(_mrange))))) +
                                        Math.Asin(_distance / Math.Abs(_mrange))))
                            : _distance > Math.Abs(_mrange) ? _mnugget + Math.Abs(_msill) : 0
                ;
                break;

            case KrigingModelType.exponential:
                _krigingModel       = new ModelExponential();
                _regressionFunction = () => _distance > 0 ?
                                      Math.Abs(_mnugget) + (Math.Abs(_msill) * (1 - Math.Exp(-3 * Math.Abs(_distance) / Math.Abs(_mrange))))
                        : 0;
                break;

            case KrigingModelType.gaussian:
                _krigingModel       = new ModelGaussian();
                _regressionFunction = () => _distance > 0 ?
                                      Math.Abs(_mnugget) +
                                      (Math.Abs(_msill) *
                                       (1 -
                                        Math.Exp(-3 * (Math.Abs(_distance) / Math.Abs(_mrange)) * (Math.Abs(_distance) / Math.Abs(_mrange)))))
                        : 0;
                break;

            case KrigingModelType.spherical:
                _krigingModel       = new ModelSpherical();
                _regressionFunction = () =>
                                      _distance > 0 && _distance <= Math.Abs(_mrange) ?
                                      Math.Abs(_mnugget) + (Math.Abs(_msill) * ((1.5 * (_distance / Math.Abs(_mrange))) -
                                                                                (0.5 * (_distance / Math.Abs(_mrange)) *
                                                                                 (_distance / Math.Abs(_mrange)) *
                                                                                 (_distance / Math.Abs(_mrange))))) :
                                      _distance > Math.Abs(_mrange) ?
                                      Math.Abs(_mnugget) + Math.Abs(_msill) :
                                      0;

                break;

            case KrigingModelType.linear:
                _krigingModel       = new ModelLineal();
                _regressionFunction = () =>
                                      _distance < _mrange ?  _mnugget + ((_msill / _mrange) * Math.Abs(_distance)): _mnugget + _msill;

                break;
            }

            if (_regressionParameters.Length == 0)
            {
                _krigingModel.Range = range;
                _krigingModel.Sill  = sill;
                if (nugget < 0)
                {
                    _krigingModel.Nugget = 0;
                }
                else
                {
                    _krigingModel.Nugget = nugget;
                }
                onChangedKriginParameter(EventArgs.Empty);
                return(_krigingModel);
            }

            if (_regressionParameters != null)
            {
                try {
                    var levenbergMarquardt = new LevenbergMarquardt(_regressionFunction, _regressionParameters,
                                                                    _observedParameters, _z);

                    for (int i = 0; i < 50; i++)
                    {
                        levenbergMarquardt.Iterate();
                    }
                    defineParametersCalculationValues(sill, range, nugget);
                } catch {
                    _krigingModel.Range = range;
                    _krigingModel.Sill  = sill;
                    if (nugget < 0)
                    {
                        _krigingModel.Nugget = 0;
                    }
                    else
                    {
                        _krigingModel.Nugget = nugget;
                    }
                    onChangedKriginParameter(EventArgs.Empty);
                    return(_krigingModel);
                }
            }

            onChangedKriginParameter(EventArgs.Empty);
            return(_krigingModel);
        }