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)); }
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; } }