// (C) 2020 Dmitri Fedorov; License: GNU GPL v3+; no warranty. using System; using static System.Math; public static partial class math{ public delegate double integrand (double x); public static double integrate (integrand f, double a, double b, double acc, double eps){ /// attempts to calculate int_a^b f(x)dx /// with absolute precision acc or relative precision eps //return adapto4(f,a,b,acc,eps); //double f1=f(a), f3=f((a+b)/2), f5=f(b); //return adaptc5(f,a,b,acc,eps,f1,f3,f5); return adaptc7(f,a,b,acc,eps); }//integrate private static double adapto4 (integrand f,double a,double b,double acc,double eps, double f2=double.NaN,double f3=double.NaN){ /// four point open adaptive integrator double h=b-a, f1=f(a+h/6), f4=f(a+5*h/6), sqr2=Sqrt(2); if(double.IsNaN(f2)){f2=f(a+2*h/6);f3=f(a+4*h/6);} double approx1=(3*f1+4*f2 +5*f4)*h/12; double approx2=(5*f1 +4*f3+3*f4)*h/12; double integral=(approx1+approx2)/2; double error=Abs(approx1-approx2)/2; double tolerance=acc+eps*Abs(integral); if(error