日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

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

發(fā)布時間:2023/12/24 综合教程 33 生活家
生活随笔 收集整理的這篇文章主要介紹了 计算方法(二)用C#实现数值积分 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在工程中,經(jīng)常會遇到積分問題,這時原函數(shù)往往都是找不到的,因此就需要用計算方法的數(shù)值積分來求。

    public class Integral
    {
        /// <summary>
        /// 梯形公式
        /// </summary>
        /// <param name="fun">被積函數(shù)</param>
        /// <param name="up">積分上限</param>
        /// <param name="down">積分下限</param>
        /// <returns>積分值</returns>

        public static double TiXing(Func<double, double> fun, double up, double down)
        {
            return (up - down) / 2 * (fun(up) + fun(down));
        }
        /// <summary>
        /// 辛普森公式
        /// </summary>
        /// <param name="fun">被積函數(shù)</param>
        /// <param name="up">積分上限</param>
        /// <param name="down">積分下限</param>
        /// <returns>積分值</returns>
        public static double Simpson(Func<double, double> fun, double up, double down)
        {
            return (up - down) / 6 * (fun(up) + fun(down) + 4 * fun((up + down) / 2));
        }
        /// <summary>
        /// 科特克斯公式
        /// </summary>
        /// <param name="fun">被積函數(shù)</param>
        /// <param name="up">積分上限</param>
        /// <param name="down">積分下限</param>
        /// <returns>積分值</returns>
        public static double Cotes(Func<double, double> fun, double up, double down)
        {
            double C = (up - down) / 90 * (7 * fun(up) + 7 * fun(down) + 32 * fun((up + 3 * down) / 4)
                     + 12 * fun((up + down) / 2) + 32 * fun((3 * up + down) / 4));
            return C;
        }
      
        /// <summary>
        /// 復化梯形公式
        /// </summary>
        /// <param name="fun">被積函數(shù)</param>
        /// <param name="N">區(qū)間劃分快數(shù)</param>
        /// <param name="up">積分上限</param>
        /// <param name="down">積分下限</param>
        /// <returns>積分值</returns>
        public static double FuHuaTiXing(Func<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 += fun(x);
            }
            result = (fun(up) + result * 2 + fun(down)) * h / 2;
            return result;
        }

        /// <summary>
        /// 復化辛浦生公式
        /// </summary>
        /// <param name="fun">被積函數(shù)</param>
        /// <param name="N">區(qū)間劃分快數(shù)</param>
        /// <param name="up">積分上限</param>
        /// <param name="down">積分下限</param>
        /// <returns>積分值</returns>
        public static double FSimpson(Func<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 * (fun(down) + 4 * fun(down + h / 2) + fun(down + h));
                down += h;
            }
            return result;
        }
        /// <summary>
        /// 復化科特斯公式
        /// </summary>
        /// <param name="fun">被積函數(shù)</param>
        /// <param name="N">區(qū)間劃分快數(shù)</param>
        /// <param name="up">積分上限</param>
        /// <param name="down">積分下限</param>
        /// <returns>積分值</returns>
        public static double FCotes(Func<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 * fun(down) + 32 * fun(down + h / 4) + 12 * fun(down + h / 2) +
                        32 * fun(down + 3 * h / 4) + 7 * fun(down + h));
                down += h;
            }
            return result;
        }
        /// <summary>
        /// 龍貝格算法
        /// </summary>
        /// <param name="fun">被積函數(shù)</param>
        /// <param name="e">結(jié)果精度</param>
        /// <param name="up">積分上限</param>
        /// <param name="down">積分下限</param>
        /// <returns>積分值</returns>
        public static double Romberg(Func<double, double> fun, double e, double up, double down)
        {
            double R1 = 0, R2 = 0;
            int k = 0; //2的k次方即為N(劃分的子區(qū)間數(shù))
            R1 = (64 * C(fun, 2 * (int)Math.Pow(2, k), up, down) - C(fun, (int)Math.Pow(2, k++), up, down)) / 63;
            R2 = (64 * C(fun, 2 * (int)Math.Pow(2, k), up, down) - C(fun, (int)Math.Pow(2, k++), up, down)) / 63;
            while (Math.Abs(R2 - R1) > e)
            {
                R1 = R2;
                R2 = (64 * C(fun, 2 * (int)Math.Pow(2, k), up, down) - C(fun, (int)Math.Pow(2, k++), up, down)) / 63;
            }
            return R2;
        }
        private static double S(Func<double, double> fun, int N, double up, double down)
        {
            return (4 * FuHuaTiXing(fun, 2 * N, up, down) - FuHuaTiXing(fun, N, up, down)) / 3;
        }
        private static double C(Func<double, double> fun, int N, double up, double down)
        {
            return (16 * S(fun, 2 * N, up, down) - S(fun, N, up, down)) / 15;
        }
    }

總結(jié)

以上是生活随笔為你收集整理的计算方法(二)用C#实现数值积分的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。