计算方法(二)用C#实现数值积分

在工程中,经常会遇到积分问题,这时原函数往往都是找不到的,因此就需要用计算方法的数值积分来求。

    public class Integral
    {
        /// <summary>
        /// 梯形公式
        /// </summary>
        /// <param name="fun">被积函数</param>
        /// <param name="up">积分上限</param>
        /// <param name="down">积分下限</param>
        /// <returns>积分值</returns>

        public static double TiXingFunc<double, double> fun, double up, double down)
        {
            return up - down) / 2 * funup) + fundown));
        }
        /// <summary>
        /// 辛普森公式
        /// </summary>
        /// <param name="fun">被积函数</param>
        /// <param name="up">积分上限</param>
        /// <param name="down">积分下限</param>
        /// <returns>积分值</returns>
        public static double SimpsonFunc<double, double> fun, double up, double down)
        {
            return up - down) / 6 * funup) + fundown) + 4 * funup + down) / 2));
        }
        /// <summary>
        /// 科特克斯公式
        /// </summary>
        /// <param name="fun">被积函数</param>
        /// <param name="up">积分上限</param>
        /// <param name="down">积分下限</param>
        /// <returns>积分值</returns>
        public static double CotesFunc<double, double> fun, double up, double down)
        {
            double C = up - down) / 90 * 7 * funup) + 7 * fundown) + 32 * funup + 3 * down) / 4)
                     + 12 * funup + down) / 2) + 32 * fun3 * up + down) / 4));
            return C;
        }
      
        /// <summary>
        /// 复化梯形公式
        /// </summary>
        /// <param name="fun">被积函数</param>
        /// <param name="N">区间划分快数</param>
        /// <param name="up">积分上限</param>
        /// <param name="down">积分下限</param>
        /// <returns>积分值</returns>
        public static double FuHuaTiXingFunc<double, double> fun, int N, double up, double down)
        {
            double h = up - down) / N;
            double result = 0;
            double x = down;
            for int i = 0; i < N - 1; i++)
            {
                x += h;
                result += funx);
            }
            result = funup) + result * 2 + fundown)) * h / 2;
            return result;
        }

        /// <summary>
        /// 复化辛浦生公式
        /// </summary>
        /// <param name="fun">被积函数</param>
        /// <param name="N">区间划分快数</param>
        /// <param name="up">积分上限</param>
        /// <param name="down">积分下限</param>
        /// <returns>积分值</returns>
        public static double FSimpsonFunc<double, double> fun, int N, double up, double down)
        {
            double h = up - down) / N;
            double result = 0;
            for int n = 0; n < N; n++)
            {
                result += h / 6 * fundown) + 4 * fundown + h / 2) + fundown + h));
                down += h;
            }
            return result;
        }
        /// <summary>
        /// 复化科特斯公式
        /// </summary>
        /// <param name="fun">被积函数</param>
        /// <param name="N">区间划分快数</param>
        /// <param name="up">积分上限</param>
        /// <param name="down">积分下限</param>
        /// <returns>积分值</returns>
        public static double FCotesFunc<double, double> fun, int N, double up, double down)
        {
            double h = up - down) / N;
            double result = 0;
            for int n = 0; n < N; n++)
            {
                result += h / 90 * 7 * fundown) + 32 * fundown + h / 4) + 12 * fundown + h / 2) +
                        32 * fundown + 3 * h / 4) + 7 * fundown + h));
                down += h;
            }
            return result;
        }
        /// <summary>
        /// 龙贝格算法
        /// </summary>
        /// <param name="fun">被积函数</param>
        /// <param name="e">结果精度</param>
        /// <param name="up">积分上限</param>
        /// <param name="down">积分下限</param>
        /// <returns>积分值</returns>
        public static double RombergFunc<double, double> fun, double e, double up, double down)
        {
            double R1 = 0, R2 = 0;
            int k = 0; //2的k次方即为N(划分的子区间数)
            R1 = 64 * Cfun, 2 * int)Math.Pow2, k), up, down) - Cfun, int)Math.Pow2, k++), up, down)) / 63;
            R2 = 64 * Cfun, 2 * int)Math.Pow2, k), up, down) - Cfun, int)Math.Pow2, k++), up, down)) / 63;
            while Math.AbsR2 - R1) > e)
            {
                R1 = R2;
                R2 = 64 * Cfun, 2 * int)Math.Pow2, k), up, down) - Cfun, int)Math.Pow2, k++), up, down)) / 63;
            }
            return R2;
        }
        private static double SFunc<double, double> fun, int N, double up, double down)
        {
            return 4 * FuHuaTiXingfun, 2 * N, up, down) - FuHuaTiXingfun, N, up, down)) / 3;
        }
        private static double CFunc<double, double> fun, int N, double up, double down)
        {
            return 16 * Sfun, 2 * N, up, down) - Sfun, N, up, down)) / 15;
        }
    }

Published by

风君子

独自遨游何稽首 揭天掀地慰生平