Change Dir

          先知cd——熱愛生活是一切藝術的開始

          統計

          留言簿(18)

          積分與排名

          “牛”們的博客

          各個公司技術

          我的鏈接

          淘寶技術

          閱讀排行榜

          評論排行榜

          Commons Math學習筆記——函數積分

           

          2.4 函數積分

          看其他篇章到目錄選擇。

          積分可以說是最常見的了,在函數的一節中我們講過函數的微分和給定變量求值,這里我們講講通過函數求積分,具體的數值積分方法和應用。什么是數值積分?在數值分析中,數值積分是計算定積分數值的方法和理論。在數學分析中,給定函數的定積分的計算不總是可行的。許多定積分不能用已知的積分公式得到精確值。數值積分是利用黎曼積分等數學定義,用數值逼近的方法近似計算給定的定積分值。借助于電子計算設備,數值積分可以快速而有效地計算復雜的積分。Commons Math中的積分包analysis.integration提供了幾種數值積分的實現,UnivariateRealIntegrator接口是積分包中的基礎接口,該接口繼承了math包中的ConvergingAlgorithm接口。具體定義了一系列方法,其中比較主要的有double integrate(UnivariateRealFunction f, double min, double max)方法,這個方法就是通過minmax設定積分區間,通過f設定被積函數,最后返回定積分值的方法。可以看到這個接口的實現是針對單變量實函數的。多元積分的實現,目前還沒有看到。

          其實在UnivariateRealIntegrator接口下,并不是實現類直接實現該接口,而是通過一個Abstract類來間接實現,首先UnivariateRealIntegratorImpl實現接口,然后具體的積分方法類來繼承這個接口,我認為這是一種策略-模板方法模式~~~

           

          那么看到了具體的結構類圖。我們以辛普森法則求積分的方法為例來看看如何應用Commons Math庫。具體的辛普森積分法可以見本文的參考資料。

          測試代碼如下,其中用到的正弦函數類在2.1節講述函數的時候有定義,忘記的同學可以回顧一下。

           

           1/**
           2 * 
           3 */

           4package algorithm.math;
           5
           6import org.apache.commons.math.ConvergenceException;
           7import org.apache.commons.math.FunctionEvaluationException;
           8import org.apache.commons.math.analysis.DifferentiableUnivariateRealFunction;
           9import org.apache.commons.math.analysis.UnivariateRealFunction;
          10import org.apache.commons.math.analysis.integration.SimpsonIntegrator;
          11import org.apache.commons.math.analysis.integration.UnivariateRealIntegrator;
          12
          13/**
          14 * @author Jia Yu
          15 * @date   2010-11-22
          16 */

          17public class IntegrationTest {
          18
          19 /**
          20  * @param args
          21  */

          22 public static void main(String[] args) {
          23  // TODO Auto-generated method stub
          24  integration();
          25 }

          26
          27 private static void integration() {
          28  // TODO Auto-generated method stub
          29  UnivariateRealFunction f = new SinFunction();
          30        UnivariateRealIntegrator integrator = new SimpsonIntegrator();
          31        
          32        //integrate
          33        System.out.println("f(x)=sin(x)");
          34        try {
          35   System.out.println("integration of f(x) from 0 to Pi is "+integrator.integrate(f, 0, Math.PI));
          36  }
           catch (ConvergenceException e) {
          37   // TODO Auto-generated catch block
          38   e.printStackTrace();
          39  }
           catch (FunctionEvaluationException e) {
          40   // TODO Auto-generated catch block
          41   e.printStackTrace();
          42  }
           catch (IllegalArgumentException e) {
          43   // TODO Auto-generated catch block
          44   e.printStackTrace();
          45  }

          46 }

          47
          48}

          49
          50


          輸出結果:
          f(x)=sin(x)
          integration of f(x) from 0 to Pi is 2.000000064530001

          想擴展的同學可以直接擴展ConvergingAlgorithmImpl抽象類,實驗自己的積分方法。

          相關資料:

          積分:http://zh.wikipedia.org/zh-cn/%E7%A7%AF%E5%88%86

          辛普森積分法:http://zh.wikipedia.org/zh-cn/%E8%BE%9B%E6%99%AE%E6%A3%AE%E7%A9%8D%E5%88%86%E6%B3%95

          辛普森積分法2 http://mathworld.wolfram.com/SimpsonsRule.html

          Commons math包:http://commons.apache.org/math/index.html

          posted on 2010-12-19 21:27 changedi 閱讀(3403) 評論(0)  編輯  收藏 所屬分類: 數學

          主站蜘蛛池模板: 江都市| 宁晋县| 平利县| 阆中市| 齐齐哈尔市| 常山县| 汝南县| 富裕县| 高州市| 永兴县| 洛宁县| 桐乡市| 永定县| 徐汇区| 黄浦区| 龙江县| 若羌县| 龙游县| 绥中县| 信宜市| 津南区| 宿迁市| 华亭县| 含山县| 贵阳市| 共和县| 新巴尔虎右旗| 永善县| 错那县| 临汾市| 永和县| 扬中市| 巴彦淖尔市| 龙山县| 郧西县| 十堰市| 伊金霍洛旗| 武平县| 盐山县| 黄龙县| 吉首市|