BetaDistributionWithTrend::BetaDistributionWithTrend(const NRLib::Trend * mean,
                                                     const NRLib::Trend * var,
                                                     const double       & lower_limit,
                                                     const double       & upper_limit,
                                                     int                  shared)
: DistributionWithTrend(shared,true)
{
  mean_ = mean->Clone();

  var_  = var->Clone();

  use_trend_cube_.resize(2);
  for(int i=0; i<2; i++)
    use_trend_cube_[i] = false;

  FindUseTrendCube(use_trend_cube_, mean_->GetTrendDimension(), mean_->GetReference());
  FindUseTrendCube(use_trend_cube_, var_ ->GetTrendDimension(), var_ ->GetReference());

  if(mean_->GetTrendDimension() == 0) {
    ni_ = 1;
    n_samples_mean_ = 1;
  }
  else {
    ni_ = 2;
    n_samples_mean_ = 100;
  }

  if(var_->GetTrendDimension() == 0) {
    nj_ = 1;
    n_samples_var_ = 1;
  }
  else {
    nj_ = 2;
    n_samples_var_ = 100;
  }

  double mean_min = mean_->GetMinValue();
  double mean_max = mean_->GetMaxValue();

  double var_min = var_->GetMinValue();
  double var_max = var_->GetMaxValue();

  double dx;
  if(ni_ == 1)
    dx = 0;
  else
    dx = (mean_max - mean_min)/(n_samples_mean_ - 1);

  double dy;
  if(nj_ == 1)
    dy = 0;
  else
    dy = (var_max  - var_min) /(n_samples_var_ - 1);

  mean_sampling_.resize(n_samples_mean_);
  for(int i=0; i<n_samples_mean_; i++)
    mean_sampling_[i] = mean_min + i*dx;

  var_sampling_.resize(n_samples_var_);
  for(int j=0; j<n_samples_var_; j++)
    var_sampling_[j]  = var_min  + j*dy;

  double a;
  double b;

  beta_distribution_ = new NRLib::Grid2D<NRLib::Distribution<double> *>(n_samples_mean_, n_samples_var_, NULL);

  for(int i=0; i<n_samples_mean_; i++) {
    for(int j=0; j<n_samples_var_; j++) {

      CalculateAlpha(mean_sampling_[i], var_sampling_[j], lower_limit, upper_limit, a);
      CalculateBeta(mean_sampling_[i],  var_sampling_[j], lower_limit, upper_limit, b);

      NRLib::Distribution<double> * dist = NULL;

      if(a > 0 && b > 0)
        dist = new NRLib::Beta(lower_limit, upper_limit, a, b);

      (*beta_distribution_)(i,j) = dist;

    }
  }
}
Пример #2
0
void CalcAlphaBeta(void) {
	CalculateAlpha();
	CalculateBeta();
}