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; } } }
void CalcAlphaBeta(void) { CalculateAlpha(); CalculateBeta(); }