コード例 #1
0
    public static Correlation.CorrelationResult sample_paths_cholesky(FullertonLib.BesselData globaldata, FullertonLib.r8BESKData kdata, int n, int n2, double rhomax, double rho0,
                                                                      Func <FullertonLib.BesselData, FullertonLib.r8BESKData, int, double[], double, Correlation.CorrelationResult> correlation, ref typeMethods.r8vecNormalData data, ref int seed)

    //****************************************************************************80
    //
    //  Purpose:
    //
    //    SAMPLE_PATHS_CHOLESKY: sample paths for stationary correlation functions.
    //
    //  Discussion:
    //
    //    This method uses the Cholesky factorization of the correlation matrix.
    //
    //  Licensing:
    //
    //    This code is distributed under the GNU LGPL license.
    //
    //  Modified:
    //
    //    11 November 2012
    //
    //  Author:
    //
    //    John Burkardt
    //
    //  Parameters:
    //
    //    Input, int N, the number of points on each path.
    //
    //    Input, int N2, the number of paths.
    //
    //    Input, double RHOMAX, the maximum value of RHO.
    //
    //    Input, double RHO0, the correlation length.
    //
    //    Input, double *CORRELATION ( int n, double rho_vec[], double rho0),
    //    the name of the function which evaluates the correlation.
    //
    //    Input/output, int &SEED, a seed for the random number
    //    generator.
    //
    //    Output, double X[N*N2], the sample paths.
    //
    {
        int flag = 0;
        int j;
        //
        //  Choose N equally spaced sample points from 0 to RHOMAX.
        //
        const double rhomin = 0.0;

        double[] rho_vec = typeMethods.r8vec_linspace_new(n, rhomin, rhomax);
        //
        //  Evaluate the correlation function.
        //
        Correlation.CorrelationResult tr = correlation(globaldata, kdata, n, rho_vec, rho0);
        double[] cor_vec = tr.result;
        globaldata = tr.data;
        //
        //  Construct the correlation matrix;
        //
        //  From the vector
        //    [ C(0), C(1), C(2), ... C(N-1) ]
        //  construct the vector
        //    [ C(N-1), ..., C(2), C(1), C(0), C(1), C(2), ...  C(N-1) ]
        //  Every row of the correlation matrix can be constructed by a subvector
        //  of this vector.
        //
        double[] cor = new double[n * n];

        for (j = 0; j < n; j++)
        {
            int i;
            for (i = 0; i < n; i++)
            {
                int k = typeMethods.i4_wrap(j - i, 0, n - 1);
                cor[i + j * n] = cor_vec[k];
            }
        }

        //
        //  Get the Cholesky factorization of COR:
        //
        //    COR = L * L'.
        //
        double[] l = typeMethods.r8mat_cholesky_factor(n, cor, ref flag);
        switch (flag)
        {
        //
        //  The matrix might not be nonnegative definite.
        //
        case 2:
            Console.WriteLine("");
            Console.WriteLine("SAMPLE_PATHS_CHOLESKY - Fatal error!");
            Console.WriteLine("  The correlation matrix is not");
            Console.WriteLine("  symmetric nonnegative definite.");
            return(null);
        }

        //
        //  Compute a matrix of N by N2 normally distributed values.
        //
        double[] r = typeMethods.r8mat_normal_01_new(n, n2, ref data, ref seed);
        //
        //  Compute the sample path.
        //
        double[] x = typeMethods.r8mat_mm_new(n, n, n2, l, r);

        Correlation.CorrelationResult res = new() { result = x, data = globaldata };

        return(res);
    }
コード例 #2
0
ファイル: Matern.cs プロジェクト: philstopford/DesignLibs_GPL
    public static CorrelationResult correlation_matern(FullertonLib.BesselData globaldata, FullertonLib.r8BESKData data, int n, double[] rho, double rho0)

    //****************************************************************************80
    //
    //  Purpose:
    //
    //    CORRELATION_MATERN evaluates the Matern correlation function.
    //
    //  Discussion:
    //
    //    In order to call this routine under a dummy name, I had to drop NU from
    //    the parameter list.
    //
    //    The Matern correlation is
    //
    //      rho1 = 2 * sqrt ( nu ) * rho / rho0
    //
    //      c(rho) = ( rho1 )^nu * BesselK ( nu, rho1 )
    //               / gamma ( nu ) / 2 ^ ( nu - 1 )
    //
    //    The Matern covariance has the form:
    //
    //      K(rho) = sigma^2 * c(rho)
    //
    //    A Gaussian process with Matern covariance has sample paths that are
    //    differentiable (nu - 1) times.
    //
    //    When nu = 0.5, the Matern covariance is the exponential covariance.
    //
    //    As nu goes to +oo, the correlation converges to exp ( - (rho/rho0)^2 ).
    //
    //  Licensing:
    //
    //    This code is distributed under the GNU LGPL license.
    //
    //  Modified:
    //
    //    03 November 2012
    //
    //  Author:
    //
    //    John Burkardt
    //
    //  Parameters:
    //
    //    Input, int N, the number of arguments.
    //
    //    Input, double RHO[N], the arguments.
    //    0.0 <= RHO.
    //
    //    Input, double RHO0, the correlation length.
    //    0.0 < RHO0.
    //
    //    Output, double C[N], the correlations.
    //
    {
        int i;

        const double nu = 2.5;

        double[] c = new double[n];

        for (i = 0; i < n; i++)
        {
            double rho1 = 2.0 * Math.Sqrt(nu) * Math.Abs(rho[i]) / rho0;

            c[i] = rho1 switch
            {
                0.0 => 1.0,
                _ => Math.Pow(rho1, nu) * FullertonLib.r8_besk(ref globaldata, ref data, nu, rho1) / r8_gamma(nu) /
                Math.Pow(2.0, nu - 1.0)
            };
        }
        return(new CorrelationResult {
            result = c, data = globaldata, kdata = data
        });
    }
}