数值作业:龙贝格算法计算积分C语言实现

根据Romberg算法计算定积分,和变步长的Simpson算法的输入都一样.算法基本分析:输入a,b(积分上下限),n为积分区间等分数,eps为计算精度,我这里1e-7,代表0乘以10的负7次方.本题目取的例子为数值书137面的例子2,f(x)= sin(x)/x,下面给出代码:

/********************************************  
    > File Name: Dragon.c  
    > Author:chendiyang  
    > School:WUST_CST_1501班  
    > Myblog:www.chendsir.com  
    > Mail:[email protected]   
    > Created Time: 2017年05月6日 星期六 12时33分10秒  
 ************************************************************************/    
#include <stdio.h>
#include <math.h>
#define N 20
#define MAX 10     //数组存的最大行数
#define a 0.0000001    //积分下限
#define b 1.0      //积分上限
#define eps 1e-7 //精度

double f(double x)//所求积分公式
{
    return sin(x) / x;
}

double computeT(double aa, double bb, long int n)//复化梯形公式
{
    int i;
    double sum, h = (bb - aa) / n;
    for (i = 1; i < n; i++)
        sum += f(aa + i * h);
    sum += (f(aa) + f(bb)) / 2;
    return (h * sum);
}

double f2(double x)
{
 return x*x;
}
int main()
{
  int i;
    long int n = N,m = 0;
    double T[MAX + 1][2];
   T[0][1]=computeT(a,b,n);
    n*= 2;
    for (m = 1; m < MAX; m++)
    {
        for (i = 0; i < m; i++)
        {
            T[i][0] = T[i][1];
        }
	T[0][1]=computeT(a,b,n);
        n *= 2;

        for (i = 1; i <= m; i++) //T的m(h)
            T[i][1] = T[i - 1][1] + (T[i - 1][1] - T[i - 1][0]) / (pow(2, 2 * m) - 1);
        if ((T[m - 1][1] < T[m][1] + eps) && (T[m - 1][1] > T[m][1] - eps))
        {
            printf("计算的数为:%lf\n", T[m][1]); //输出
            return 0;
        }
    }
    printf("此题没有解...\n");
    return 0;
}

运行结果:


可见计算的结果是正确的,然而中间因为一个小小的中文空格替换问题,调试了整整一小时,等发现错在哪之后,才拍大腿,恍然大悟,脑子一直在想我TM到底错在哪了.虽然烦,以前一位学长说程序员们基本都是吾日三省吾身的,每当Debug的时候,感触最深..

纸上得来终觉浅,绝知此事需躬行.

猜你喜欢

转载自blog.csdn.net/Chen_dSir/article/details/71270316