開源Math.NET基礎數學類庫使用(08)C#進行數值積分

來源:互聯網
上載者:User

標籤:

原文:【原創】開源Math.NET基礎數學類庫使用(08)C#進行數值積分

              本部落格所有文章分類的總目錄:http://www.cnblogs.com/asxinyu/p/4288836.html

開源Math.NET基礎數學類庫使用總目錄:http://www.cnblogs.com/asxinyu/p/4329737.html 

前言

  在數值計算的需求中,數值積分也是比較常見的一個。我們也知道像Matlab,Mathematics等軟體的積分求解功能非常高大上,不僅能求解定積分,還能求解不定積分,甚至多重積分等等。而Math.NET這個組件沒有如此進階的功能,目前也只提供了比較件的閉區間上的定積分求解功能。今天就一起來看看,因為不定積分涉及到符號計算,因此其背後的原理和實現要複雜得多。就連Matlab這種軟體暫時也不支援混編編程求解符號計算相關的功能。

  如果本文資源或者顯示有問題,請參考 本文原文地址:http://www.cnblogs.com/asxinyu/p/4301017.html 

1.定積分

  很多人可能已經淡忘了定積分的概念,當然需要用到的朋友看到這裡,也基本不用看本段的內容,比較簡單,高等數學已經是10多年前學過的東西了,雖然以前很精通,現在也只能憑印象理解和網路來對這個概念稍微進行整理,可能有些不完整或小錯誤,還請諒解。

  數學定義:如果函數f(x)在區間[a,b]上連續,用分點xi將區間[a,b]分為n 個小區間,在每個小區間[xi-1,xi]上任取一點ri(i=1,2,3„,n) ,作和式f(r1)+...+f(rn) ,當n趨於無窮大時,上述和式無限趨近於某個常數A,這個常數叫做y=f(x) 在區間上的定積分. 記作/ab f(x) dx 即 /ab f(x) dx =limn>00 [f(r1)+...+f(rn)], 這裡,a 與 b叫做積分下限與積分上限,區間[a,b] 叫做積分區間,函數f(x) 叫做被積函數,x 叫做積分變數,f(x)dx 叫做被積式。

  幾何定義:可以理解為在 Oxy座標平面上,由曲線y=f(x)與直線x=a,x=b以及x軸圍成的曲邊梯形的面積值(一種確定的實數值)。

詳細的可以參考以下連結:

        定積分的計算公式和性質:http://www.shuxuecheng.com/gaosuzk/content/lljx/wzja/5/5-2.htm

2.Math.NET關於定積分的實現

   Math.NET中對定積分的實現都在MathNet.Numerics.Integration命名空間以及Integrate.cs中,Integrate靜態類其實是對Integration命名空間下幾個近似積分方法的實現。Math.NET定積分的近似求解主要是用到了“梯形法則”,詳細的內容可以參考以下:連結,其原理非常簡單。這裡我們只介紹經常用到的Integrate靜態類的實現,很簡單,其他內部實現過程可以查源碼:

 1 using System; 2 using MathNet.Numerics.Integration; 3  4 namespace MathNet.Numerics 5 { 6     /// <summary> 7     /// 數值積分類 8     /// </summary> 9     public static class Integrate10     {11         /// <summary>      12         /// 近似解析光滑函數在閉區間上的定積分13         /// </summary>14         /// <param name="f">The analytic smooth function to integrate.</param>15         /// <param name="intervalBegin">Where the interval starts, inclusive and finite.</param>16         /// <param name="intervalEnd">Where the interval stops, inclusive and finite.</param>17         /// <param name="targetAbsoluteError">The expected relative accuracy of the approximation.</param>18         /// <returns>Approximation of the finite integral in the given interval.</returns>19         public static double OnClosedInterval(Func<double, double> f, double intervalBegin, double intervalEnd, double targetAbsoluteError)20         {21             return DoubleExponentialTransformation.Integrate(f, intervalBegin, intervalEnd, targetAbsoluteError);22         }23 24         /// <summary>   25         ///  近似解析光滑函數在閉區間上的定積分26         /// </summary>27         /// <param name="f">The analytic smooth function to integrate.</param>28         /// <param name="intervalBegin">Where the interval starts, inclusive and finite.</param>29         /// <param name="intervalEnd">Where the interval stops, inclusive and finite.</param>30         /// <returns>Approximation of the finite integral in the given interval.</returns>31         public static double OnClosedInterval(Func<double, double> f, double intervalBegin, double intervalEnd)32         {33             return DoubleExponentialTransformation.Integrate(f, intervalBegin, intervalEnd, 1e-8);34         }35     }36 }

  下面的例子就是直接調用該類進行的。  

3.C#使用Math.NET求解定積分的例子

   使用比較簡單,直接看源碼:

 1 // 1. Integrate x*x on interval [0, 10] 2 Console.WriteLine(@"1.函數 x*x 在閉區間 [0, 10] 上的積分"); 3 var result = Integrate.OnClosedInterval(x => x * x, 0, 10); 4 Console.WriteLine(result); 5 Console.WriteLine(); 6  7 // 2. Integrate 1/(x^3 + 1) on interval [0, 1] 8 Console.WriteLine(@"2.函數 1/(x^3 + 1) 在閉區間 [0, 1] 上的積分"); 9 result = Integrate.OnClosedInterval(x => 1 / (Math.Pow(x, 3) + 1), 0, 1);10 Console.WriteLine(result);11 Console.WriteLine();12 13 // 3. Integrate f(x) = exp(-x/5) (2 + sin(2 * x)) on [0, 10]14 Console.WriteLine(@"3.函數 f(x) = exp(-x/5) (2 + sin(2 * x)) 在 [0, 10]上的積分");15 result = Integrate.OnClosedInterval(x => Math.Exp(-x / 5) * (2 + Math.Sin(2 * x)), 0, 100);16 Console.WriteLine(result);17 Console.WriteLine();18 19 // 4. Integrate target function with absolute error = 1E-420 Console.WriteLine(@"4. 對目標函數進行積分,絕對誤差= 1E-4 ,區間 [0, 10]");21 Console.WriteLine(@"public static double TargetFunctionA(double x)22 {23 return Math.Exp(-x / 5) * (2 + Math.Sin(2 * x));24 }");25 result = Integrate.OnClosedInterval(TargetFunctionA, 0, 100, 1e-4);26 Console.WriteLine(result);27 Console.WriteLine();

參數主要有3個:函數,積分下限,積分上限,其他的就是附帶一個絕對誤差了,看看運行結果:

1.函數 x*x 在閉區間 [0, 10] 上的積分333.3333333333322.函數 1/(x^3 + 1) 在閉區間 [0, 1] 上的積分0.8356488482647023.函數 f(x) = exp(-x/5) (2 + sin(2 * x)) 在 [0, 10]上的積分10.49504948392724. 對目標函數進行積分,絕對誤差= 1E-4 ,區間 [0, 10]public static double TargetFunctionA(double x){    return Math.Exp(-x / 5) * (2 + Math.Sin(2 * x));}10.4950494839276
4.資源

  源碼下載:http://www.cnblogs.com/asxinyu/p/4264638.html

  如果本文資源或者顯示有問題,請參考 本文原文地址:http://www.cnblogs.com/asxinyu/p/4301017.html

 

開源Math.NET基礎數學類庫使用(08)C#進行數值積分

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.