发布网友 发布时间:2023-08-16 04:52
共3个回答
热心网友 时间:2023-11-10 08:27
//利用Simpson公式来求定积分
#include<stdio.h>
#include<math.h>
double T(double x,double y,int z,double (*fun)(double)) ;
double integral (double a,double b,double (*fun)(double));
double f1(double t);
double f2(double t);
double f3(double t);
double f4(double t);
double f5(double t);
int n=0; //用来记录积分区间划分的间隔数,数量越大,越精确
void main()
{
double a,b,s;
printf("积分下限 a:\n");
scanf("%lf",&a);
printf("积分上限 b:\n");
scanf("%lf",&b);
printf("区间等分个数 n :\n");
scanf("%d",&n);
/*利用辛甫生公式求解定积分*/
s=integral(a,b,f1);//用函数f1来验证
printf("函数 f(x)在区间%f到%f 的积分值为 s=%f\n",a,b,s);
}
double f1(double t)
{
return 1+t;
}
double f2(double t)
{
return 3+2*t;
}
double f3(double t)
{
return pow(2.71828,t)+1;//自然常数e,取了一个近似值2.71828
}
double f4(double t)
{
return (1+t)*(1+t);
}
double f5(double t)
{
return t*t*t;
}
//辛普森公式:
double T(double x,double y,int z,double (*fun)(double))
{
double h,Tn;
int i;
h=(y-x)/z;
Tn=(fun(x)+fun(y))/2;
for(i=1;i<z;i++)
Tn=Tn+fun(x+i*h);
Tn=Tn*h;
return (Tn);
}
double integral(double x,double y,double(*fun)(double))
{
return (4*T(x,y,2*n,fun)-T(x,y,n,fun))/3;
}
验证结果:
通过数学知识,我们可以知道
f1(t)=1+t;(积分应该是t+0.5*t*t+任意常数)在区间0到1之间定积分的确是1.5
热心网友 时间:2023-11-10 08:27
//利用Simpson公式来求定积分
#include<stdio.h>
#include<math.h>
double f1(double);
double f2(double);
double f3(double);
double f4(double);
double f5(double);
double T(double x,double y,int z,double (*fun)(double));
double integral(double a,double b,double (*fun)(double));
int n=0;//用来记录积分区间划分的间隔数,数量越大,越精确
int main()
{
double a,b,s1,s2,s3,s4,s5;
printf("积分上限 a:");
scanf("%lf",&a);
printf("积分下限 b:");
scanf("%lf",&b);
printf("区间等分个数 n:");
scanf("%d",&n);
s1=integral(a,b,f1);
s2=integral(a,b,f2);
s3=integral(a,b,f3);
s4=integral(a,b,f4);
s5=integral(a,b,f5);
printf("函数f1在区间%f到%f 的积分值为 s=%f\n",a,b,s1);
printf("函数f2在区间%f到%f 的积分值为 s=%f\n",a,b,s2);
printf("函数f3在区间%f到%f 的积分值为 s=%f\n",a,b,s3);
printf("函数f4在区间%f到%f 的积分值为 s=%f\n",a,b,s4);
printf("函数f5在区间%f到%f 的积分值为 s=%f\n",a,b,s5);
return 0;
}
double f1(double x)
{
return x+1;
}
double f2(double x)
{
return 2*x+3;
}
double f3(double x)
{
return pow(2.71828,x)+1;
}
double f4(double x)
{
return pow(x+1,2);
}
double f5(double x)
{
return pow(x,3);
}
double T(double x,double y,int z,double (*fun)(double))
{
double h,Tn;
int i;
h=(x+y)/z;
Tn=((*fun)(x)+(*fun)(y))/2;
for(i=1;i<z;i++)
Tn+=(*fun)(x+i*h);
Tn=Tn*h;
return Tn;
}
double integral(double x,double y,double (*fun)(double))
{
return (4*T(x,y,2*n,fun)-T(x,y,n,fun))/3;
}
//利用Simpson公式来求定积分
#include<stdio.h>
#include<math.h>
double f1(double);
double f2(double);
double f3(double);
double f4(double);
double f5(double);
double T(double x,double y,int z,double (*fun)(double));
double integral(double a,double b,double (*fun)(double));
int n=0;//用来记录积分区间划分的间隔数,数量越大,越精确
int main()
{
double a,b,s1,s2,s3,s4,s5;
printf("积分上限 a:");
scanf("%lf",&a);
printf("积分下限 b:");
scanf("%lf",&b);
printf("区间等分个数 n:");
scanf("%d",&n);
s1=integral(a,b,f1);
s2=integral(a,b,f2);
s3=integral(a,b,f3);
s4=integral(a,b,f4);
s5=integral(a,b,f5);
printf("函数f1在区间%f到%f 的积分值为 s=%f\n",a,b,s1);
printf("函数f2在区间%f到%f 的积分值为 s=%f\n",a,b,s2);
printf("函数f3在区间%f到%f 的积分值为 s=%f\n",a,b,s3);
printf("函数f4在区间%f到%f 的积分值为 s=%f\n",a,b,s4);
printf("函数f5在区间%f到%f 的积分值为 s=%f\n",a,b,s5);
return 0;
}
double f1(double x)
{
return x+1;
}
double f2(double x)
{
return 2*x+3;
}
double f3(double x)
{
return pow(2.71828,x)+1;
}
double f4(double x)
{
return pow(x+1,2);
}
double f5(double x)
{
return pow(x,3);
}
double T(double x,double y,int z,double (*fun)(double))
{
double h,Tn;
int i;
h=(x+y)/z;
Tn=((*fun)(x)+(*fun)(y))/2;
for(i=1;i<z;i++)
Tn+=(*fun)(x+i*h);
Tn=Tn*h;
return Tn;
}
double integral(double x,double y,double (*fun)(double))
{
return (4*T(x,y,2*n,fun)-T(x,y,n,fun))/3;
}
热心网友 时间:2023-11-10 08:28
//简单的写了一下按照最原始的定积分思想来的