Пример #1
0
        fn_qaws(double x, fn_qaws_params p)
        {
            Func <double, double>      f = p.function;
            gsl_integration_qaws_table t = p.table;

            double factor = 1.0;

            if (t.alpha != 0.0)
            {
                factor *= Math.Pow(x - p.a, t.alpha);
            }

            if (t.beta != 0.0)
            {
                factor *= Math.Pow(p.b - x, t.beta);
            }

            if (t.mu == 1)
            {
                factor *= Math.Log(x - p.a);
            }

            if (t.nu == 1)
            {
                factor *= Math.Log(p.b - x);
            }

            return(factor * f(x));
        }
Пример #2
0
        qc25s(Func <double, double> f, double a, double b, double a1, double b1,
              gsl_integration_qaws_table t,
              out double result, out double abserr, out bool err_reliable)
        {
            var fn_params = new fn_qaws_params
            {
                function = f,
                a        = a,
                b        = b,
                table    = t
            };

            Func <double, double> weighted_function;

            if (a1 == a && (t.alpha != 0.0 || t.mu != 0))
            {
                double[] cheb12 = new double[13], cheb24 = new double[25];

                double factor = Math.Pow(0.5 * (b1 - a1), t.alpha + 1.0);

                weighted_function = delegate(double tt)
                { return(fn_qaws_R(tt, fn_params)); };

                Qcheb.Approximation(weighted_function, a1, b1, cheb12, cheb24);

                if (t.mu == 0)
                {
                    double u = factor;

                    compute_result(t.ri, cheb12, cheb24, out var res12, out var res24);

                    result = u * res24;
                    abserr = Math.Abs(u * (res24 - res12));
                }
                else
                {
                    double u = factor * Math.Log(b1 - a1);
                    double v = factor;

                    compute_result(t.ri, cheb12, cheb24, out var res12a, out var res24a);
                    compute_result(t.rg, cheb12, cheb24, out var res12b, out var res24b);

                    result = u * res24a + v * res24b;
                    abserr = Math.Abs(u * (res24a - res12a)) + Math.Abs(v * (res24b - res12b));
                }

                err_reliable = false;

                return;
            }
            else if (b1 == b && (t.beta != 0.0 || t.nu != 0))
            {
                double[] cheb12 = new double[13], cheb24 = new double[25];
                double   factor = Math.Pow(0.5 * (b1 - a1), t.beta + 1.0);

                weighted_function = delegate(double tt)
                { return(fn_qaws_L(tt, fn_params)); };

                Qcheb.Approximation(weighted_function, a1, b1, cheb12, cheb24);

                if (t.nu == 0)
                {
                    double u = factor;

                    compute_result(t.rj, cheb12, cheb24, out var res12, out var res24);

                    result = u * res24;
                    abserr = Math.Abs(u * (res24 - res12));
                }
                else
                {
                    double u = factor * Math.Log(b1 - a1);
                    double v = factor;

                    compute_result(t.rj, cheb12, cheb24, out var res12a, out var res24a);
                    compute_result(t.rh, cheb12, cheb24, out var res12b, out var res24b);

                    result = u * res24a + v * res24b;
                    abserr = Math.Abs(u * (res24a - res12a)) + Math.Abs(v * (res24b - res12b));
                }

                err_reliable = false;

                return;
            }
            else
            {
                weighted_function = delegate(double tt)
                { return(fn_qaws(tt, fn_params)); };

                QK15.Integration(weighted_function, a1, b1, out result, out abserr,
                                 out var resabs, out var resasc);

                if (abserr == resasc)
                {
                    err_reliable = false;
                }
                else
                {
                    err_reliable = true;
                }

                return;
            }
        }