/*辛普生公式求定积分,公式为:S[n]=(4*T[2*n]-T[n])/3,其中T[2n],T[n]为梯形公式计算结果*/
double Simposn(double down, double up, int n)
{
double s;
/*辛普生公式*/
s = (4*T(down, up, 2*n) - T(down, up, n))/3;
return s;
}
/*高斯公式求定积分*/
double Gass(double (*func)(double x), double a, double b, int n)
{
int i = 0;
//高斯点及其求积系数列表
float x1 ={0.0};
float A1 ={2};
float x2 ={-0.5573503,0.5573503};
float A2 ={1,1};
float x3 ={-0.7745967,0.0,0.7745967};
float A3 ={0.555556,0.888889,0.555556};
float x4 ={0.3399810,-0.3399810,0.8611363,-0.8611363};
float A4 ={0.6521452,0.6521452,0.3478548,0.3478548};
float x5 ={0.0,0.5384693,-0.5384693,0.9061799,-0.9061799};
float A5 ={0.5688889,0.4786287,0.4786287,0.2369269,0.2369269};
float *p, *t;
switch (n)
{
case 1:
p = x1;
t = A1;
break;
case 2:
p = x2;
t = A2;
break;
case 3:
p = x3;
t = A3;
break;
case 4:
p = x4;
t = A4;
break;
case 5:
p = x5;
t = A5;
break;
default :
printf("intput wrong!");
}
float g = 0;
for (i=0; i<n; i++)
{
g += (*func)((b-a)*p[i]/2+(a+b)/2)*t[i];
}
g *= (b-a)/2;
return g;
}
int main(int argc, char *argv[])
{
printf("随机点法积分值%f\n", Darts(10000));
double down, up;
int n;
double sum = 0;
printf("积分下限:\n");
scanf("%lf", &down);
printf("积分上限:\n");
scanf("%lf", &up);
printf("分隔数目:\n");
scanf("%d", &n);
sum = LeftRect(down, up, n);
printf("左矩形法积分值为:%f\n", sum);
sum = Trape(down, up, n);
printf("梯形公式积分值为:%f\n", sum);
sum = Simposn(down, up, n);
printf("辛普生公式积分值为:%f\n", sum);
sum = Gass(fun, down, up, N);
printf("高斯公式积分值为:%f\n", sum);
return 0;
}