标题:利用函數指針編寫一個通用的求定積分函數
只看楼主
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
结帖率:100%
 问题点数:0 回复次数:6 
利用函數指針編寫一個通用的求定積分函數
程序代码:
/*
功能:利用函數指針編寫一個通用的求定積分函數
最後編輯:2015.10.13
*/

// 在VC中,要使用標準C庫的數學常數,應定義如下宏
#define _USE_MATH_DEFINES

#include <stdio.h>
#include <math.h>
#include <conio.h>

//--------------------------------------
// 功能:通用的求定積分函數
// 參數:fun - 所求函數的指針,帶1個double形參
//       x1  - 積分下限
//       x2  - 積分上限
// 返回:定積分結果
// 備註:調用者應自己保證函數在區間[x1,x2]內可積
//--------------------------------------
double Get_Integral(double fun(double), double x1, double x2)
{
    // 微元長度:假設輸出精度為小數點後4位,則此處取5位
    static const double interval = 0.00001;

    double integral = 0;        // 結果
    //   下面for()聲明double x屬於C99標準,VC的C編譯模式不支持,但其C++模式支持,若一定要在VC中用C編譯
    // 模式,把double x聲明放到函數開始處。強制VC使用C編譯的方法,是把源代碼文件擴展名取.c,默認取.cpp
    // 為C++編譯。
    for (double x = x1; x <= x2; x += interval)
    { 
        //------------------------------
        // 定積分的幾何意義:
        //     定積分意味著函數曲線在上下區間內與x軸所圍成的圖形面積,算法是分割微元矩形求和,即x軸上
        // 任意取一極小橫段(由interval表示),與此處曲線的高度(由函數的値fun(x)表示),構成一個微元
        // 矩形,在整個區間內計算所有這樣的微元矩形面積(寬*高),其總和即為所求曲線圖形的近似面積。
        // 祗要interval足夠小,這樣求得的近似面積可以滿足精度要求。
        //     interval數値越小越精確,然而耗時也越多;數値越大誤差越大,然而計算較快。平衡關鍵點是在實
        // 際使用過程中按精度需求和運行情況調整interval的値。如何在自己的程序中方便地調整interval的値
        // 又不至於改動太多的源代碼,是下一步改進的思考點,不是現在達到目的就行了。
        //
        // 注意:
        //     定積分的結果與函數的正負値有關,它們會互相抵消,若要求真正的幾何面積,需按照正負區間分
        // 別計算然後用絕對値相加,應先做數學分析。
        //------------------------------
        integral += fun(x) * interval;
    }
    return integral;
}

//--------------------------------------
// 函數:f(x)=x
// 幾何圖形:斜45°直線
//--------------------------------------
double Fun1(double x)
{
    return x;
}

//--------------------------------------
// 函數:f(x)=x^2
// 幾何圖形:向上開口的拋物線
//--------------------------------------
double Fun2(double x)
{
    return x * x;
}

//--------------------------------------
// 函數:f(x)=Sin(x)
// 幾何圖形:正弦曲線
//--------------------------------------
double Fun3(double x)
{
    return sin(x);
}

//--------------------------------------
// 函數:f(x)=Cos(x)
// 幾何圖形:余弦曲線
//--------------------------------------
double Fun4(double x)
{
    return cos(x);
}

//--------------------------------------
// 驗證通用定積分函數,用同一個求定積分函數求出4個不同函數的定積分
//--------------------------------------
int main(void)
{
    double x1, x2, integral;

    // 驗證[0,1]的直線面積為1/2
    x1 = 0;
    x2 = 1;
    integral = Get_Integral(Fun1, x1, x2);
    printf_s("Integral f(x)=x [%.4f, %.4f] = %.4f\n", x1, x2, integral);

    // 驗證拋物線面積
    x1 = 0;
    x2 = 1;
    integral = Get_Integral(Fun2, x1, x2);
    printf_s("Integral f(x)=x^2 [%.4f, %.4f] = %.4f\n", x1, x2, integral);

    // 驗證[0,π]的正弦曲線面積
    x1 = 0;
    x2 = M_PI;
    integral = Get_Integral(Fun3, x1, x2);
    printf_s("Integral f(x)=Sin(x) [%.4f, %.4f] = %.4f\n", x1, x2, integral);

    // 驗證[0,2π]的余弦曲線面積為零,因正負抵消
    x1 = 0;
    x2 = 2 * M_PI;
    integral = Get_Integral(Fun4, x1, x2);
    printf_s("Integral f(x)=Cos(x) [%.4f, %.4f] = %.4f\n", x1, x2, integral);

    _getch();           // VC專用的控制臺鍵盤按鍵讀取函數,在conio頭中,不要用getchar()

    return 0;
}
搜索更多相关主题的帖子: color 通用 
2015-10-13 13:30
深秋2015
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:12
帖 子:402
专家分:1500
注 册:2015-10-13
得分:0 
支持版主

从此以后我都不敢抬头看
仿佛我的天空失去了颜色
2015-10-13 13:51
Spy001
Rank: 9Rank: 9Rank: 9
来 自:山那边
等 级:贵宾
威 望:10
帖 子:138
专家分:1360
注 册:2015-1-23
得分:0 
看注释比看代码费劲,那繁体字很给力

千百年之后,谁又还记得谁........
2015-10-13 22:55
ztory
Rank: 2
等 级:论坛游民
威 望:1
帖 子:15
专家分:62
注 册:2015-10-12
得分:0 
感谢
2015-10-15 17:07
令狐少侠56
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:320
专家分:175
注 册:2014-4-10
得分:0 
繁体字真的不好看
2015-10-17 15:59
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
得分:0 
繁体字不好认

一片落叶掉进了回忆的流年。
2015-10-17 16:24
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
編程需要注意細節。關於“繁體字”的問題,舉個例子:宋代名人“欧阳修”,到底是哪個字?不同的字有不同的意思,搞清楚是哪個字,獲得的信息也不同,能讓你更瞭解這個人。編程的人,也需要這樣的細微區分,很多時候,極細微的差異,結果是截然不同的,沒有這種敏感性,編程也祗能是渾渾噩噩、得過且過。老祖宗把字造的繁,是為了讓讀文字的人用心去思索!

授人以渔,不授人以鱼。
2015-10-18 13:45



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-458141-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.073191 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved