【计算方法】数值积分

1.在高等数学中,积分一直是我们的重点。学过一重积分,二重积分,三重积分,分别几何中对应着线、面、体。用计算机去求解数值积分则是另一种思想,之前和付老师聊过,关于数学模型的问题,那是读吴军《智能革命》时遇到他写的用数据去建立一个数学模型,当时自己的疑问就是这个数学模型是不是一个映射,他能根据输入的数据x–映射–输出的y。后来付老师说了很多,至今只有一点还是清楚的:现实世界是连续的,计算机是离散的,而显示出来的数据需要是连续的,两两者之间就存在转化关系。
2.今天学到的计算方法中数值积分就是将联系的转换成离散的计算然后再连续累加。
3.积分的本质是无穷小的和–曾几何时看到一本书写的,很受启发,一直记得。后来和老师谈起,他还不相信,摇头说我错了。旁边的好盆友说那应该是有限个无穷小吧,当时经过脑子就直接认同,回来查看自己的数学课本(又像个无穷小仍然是无穷小)。对这些东西有进一步了解深刻。


【问题对象】

这里写图片描述

【理论基础】

这里写图片描述

【收敛条件】

这里写图片描述

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#define ex 0.5*pow(10,-5)
#define N 20
/******************************************
*数值积分
* 用复化梯形积分和变步长梯形积分求
*被积函数 : 1/(x*x +1)  积分区间 : [0,1]
******************************************/
//被积函数
double f(double x) {
     return 1 / (x * x + 1);
}

/*******************************
*复化梯形积分方法求解
********************************/
double method1(double h,double a, double b) {
     double T = 0; 
     for (int k = 1; k < N; k++) {
      T += f(a + k * h);
     }
     T= (h / 2) * (f(a) + 2*T + f(b));
     return T;
}
/*******************************************
*变步长求解梯形积分
*********************************************/
double method2(double h, double a, double b) {
     double T1 = (f(a) + f(b))*h/2;
     double T2 = 0;
     double x;
     int k = 1;
     do {
      double s = 0;
      x = a + h /2;
      //计算f(X k+ 1/2)
      do {
       s += f(x);
       x += h;
      }while(x < b);
      T2 = (T1 + h * s) / 2;
      printf("第 %d 次    T1 = %4lf------T2 = %4lf\n",k++, T1, T2);
      if (fabs(T2 - T1) < ex) {
       break;
      } else {
       T1 = T2;
       h /= 2;  //再次二分区间
      }
     }while(1);
     return T2;
}
//辛普森求解
double Simpton(double h, double a, double b) {
     double x = a + h / 2;
     double s1 = f(x);
     double s2 = 0;
     for (int i = 1; i < N; i++) {
      s1 += f(a + i * h + h / 2 );
      s2 += f(a + i * h);
     }
     s2 = h * (f(a) + 4 * s1 + 2 * s2 + f(b)) / 6;
     return s2;
}

int main() 
{
     double result = 0;
     double a = 0;
     double b = 1;
     double h = (b - a) / N;
     //1.调用复化梯形积分求解
     result = method1(h, a, b);
     printf("复化梯形积分求解答案 : %lf\n",result);

     //2.等步长
     result = method2(h, a, b);
     printf("等步长积分求解答案 : %lf\n", result);
     //复化辛普森
     result = Simpton(h, a, b);
     printf("复化辛普森求解答案 : %lf\n", result);
     return 0;
}

【求解结果】

这里写图片描述

猜你喜欢

转载自blog.csdn.net/alearn_/article/details/80461258