求NewtonCotes系数

求NewtonCotes系数
  1. #include<iostream.h>
  2. #include<math.h>
  3. # define Precision 0.01//积分精度要求
  4. #include <iomanip.h>
  5. #include <windows.h>
  6. #define jieshu  10   //NewtonCotes的阶数
  7. double Factorial (long n)
  8. {
  9.     long s;
  10.     s=1.0;
  11.     while (n>0)
  12.     {
  13.         s=s*n;
  14.         n--;
  15.     }
  16.     return s;
  17. }
  18. double function(int n,int k,double t)//被积函数
  19. {
  20.     double s,d;
  21.     s=1.0;
  22.     for(int j=0;j<=n;j++)
  23.     {
  24.         if(j!=k)
  25.         {
  26.             s=s*(t-j);
  27.         }
  28.         
  29.     }
  30.     return s;
  31. }
  32. double VariableStepSimpson(int n1,int k1,double a,double b,double f(int n1,int k1,double x))//变步长Simpson公式
  33. {
  34.     int n,k,n2,k2;
  35.     n2=n1;
  36.     k2=k1;
  37.     double h,fa,fb,Tn,T2n,s,s1,s2,xk,p;
  38.     n=1;
  39.     h=b-a;
  40.     fa=f(n2,k2,a);
  41.     fb=f(n2,k2,b);
  42.     Tn=h*(fa+fb)/2.0;//计算T`1`=(b-a)/[f(a)+f(b)];
  43.     s1=Tn;
  44.     p=Precision+1.0;
  45.     while(p>=Precision)
  46.     {
  47.         s=0.0;
  48.         for(k=0;k<n;k++)
  49.         {
  50.            xk=a+(k+0.501)*h;
  51.            s=s+f(n2,k2,xk);
  52.         }
  53.         T2n=(Tn+h*s)/2.0;//计算T2n
  54.         s2=(4.0*T2n-Tn)/3.0;//计算Sn
  55.         p=fabs(s2-s1);
  56.         Tn=T2n;
  57.         s1=s2;
  58.         n=n+n;
  59.         h=h/2.0;
  60.     }
  61.     return s2;
  62. }
  63. main()
  64. {
  65.   HANDLE hOut;
  66.   COORD Position;
  67.   hOut = GetStdHandle(STD_OUTPUT_HANDLE);
  68.   Position.X = 500;
  69.   Position.Y = 500;
  70.   SetConsoleScreenBufferSize(hOut,Position);//设置输出屏幕的大小
  71.     double a[jieshu+1][jieshu+1];
  72.     int n,k;
  73.     double s,s1,t;
  74.     for(n=1;n<=jieshu;n++)
  75.     {
  76.         for(k=0;k<=n;k++)
  77.         {
  78.             a[n][k]=10;
  79.         }
  80.     }                       //初始化数组
  81.       
  82.     for(n=1;n<=jieshu;n++)
  83.     {
  84.         for(k=0;k<=n;k++)
  85.         {
  86.             s=VariableStepSimpson(n,k,0,n,function);
  87.             s=s*pow(-1,n-k);
  88.             s1=(n*Factorial(k)*Factorial(n-k));
  89.             s=s/s1;
  90.             a[n][k]=s;
  91.         }                                              //计算系数
  92.     } 
  93.     for(n=1;n<jieshu;n++)
  94.     {
  95.         for(k=0;k<=n/2;k++)
  96.         {
  97.             t=(a[n][k]+a[n][n-k])/2;
  98.             a[n][k]=a[n][n-k]=t;    
  99.         }
  100.     }                                                 //利用对称相等的性质把对称的两个数相加除以2
  101.    for(n=1;n<=jieshu;n++)
  102.     {
  103.         if(n<10)
  104.         {
  105.             cout<<"n="<<n<<"   ";
  106.         }
  107.         else
  108.         {
  109.             cout<<"n="<<n<<"  ";
  110.         }
  111.     
  112.             for(k=0;k<=n;k++)
  113.         {
  114.             cout<<setiosflags(ios::fixed)<<setprecision(6)<<a[n][k]<<"  ";
  115.         }
  116.         cout<<endl;
  117.     }
  118.     
  119.     
  120. }

xk=a+(k+0.501)*h
#define jieshu  13    //NewtonCotes的阶数
# define Precision 0.001//积分精度要求
程序的运行时间特别长,主要和以上三个因素有关,在xk=a+(k+0.5001)*h中,本应该是乘以0.5的,但是这样运算时,在double function(int n,int k,double t)函数中会得到0,从而使部分运算结果为0(错误),所以就改为0.501了,阶数和积分精度也花了很长运行时间,根据运算的结果,我觉得课本上好像是正确的,-4540/28350=-0.16014109347442680776014109347443 ,-45440/28350= -1.6028218694885361552028218694885,
由于取了0.5001,最后算出的结果Cotes系数不是很对称,最后把对应的两个数相加除以二,这样得到的结果就更加精确,和真实值更加接近

在求积分的时候用了变步长Simpson公式
下面是两种情况下运行的结果,第二种花费时间长一些



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值