急!!!利用函数指针变量编写一个求定积分的通用函数,

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了急!!!利用函数指针变量编写一个求定积分的通用函数,相关的知识,希望对你有一定的参考价值。

用它分别求5个函数的定积分:每次需要求定积分的函数是不一样的。可以编写一个求定积分的通用函数integral,它有3个形参: 下限a、上限b,以及指向函数的指针变量fun。函数原型可写为

double integral (double a,double b,double (*fun)(double));

分别编写5个函数f1,f2,f3,f4,f5, 用来求上面5个函数的值。然后先后调用integral函数5次,每次调用时把a,b以及f1,f2,f3,f4,f5之一作为实参,即把上限、下限以及有关函数的入口地址传送给形参fun。在执行integral函数过程中求出各函数定积分的值。 五个函数分别。为: 1+x; 2x+3; e的x次方+1;(1+x)*(1+x); x*x*x。 谢谢大神了, 我急用
每一步最好有注释。 谢谢了。

//利用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

追问

能说明一下你编的程序函数模块介绍么(函数的作用)? 最好有个框图,算法什么的, 谢谢了。

追答

你去查下 simpson公式吧,我一时是说不明白的,实际上就来源于定积分的定义
把一个区间划分成N多份,N足够大时,两个间隔间和f(x)的值组成的梯形就能看成一个矩形,然后把每个矩形的面积加起来就是定积分了。但我可以保证的是,程序是对的,你可以去自己改传入的函数指针验证。

追问

呃,刚才我查到函数模块了。 还需要写个算法框图,求大神!!! 谢谢,谢谢。

追答

上次已经给你说了思想了,定积分的定义来转化的,这就是算法了啊

参考技术A

//利用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;


参考技术B //简单的写了一下按照最原始的定积分思想来的
#include<stdio.h>
//定积分通用函数
double integral (double a,double b,double (*fun)(double)); //函数声明
double func1(double x); //函数声明

// 主函数
void main()

double dintegral;
double a = 1,b = 2; //上下限
dintegral = integral(a,b,func1); //调用定积分函数
printf("积分上限:%.2f,下限 %.2f所求函数f(x) = x + 1 积分为:%.2f \n",a,b,dintegral);

//定积分函数 a下限 b 上限 (*fun)(double) 函数指针 梯形法求积分
double integral (double a,double b,double (*fun)(double))

//设置积分精度
int iAccuracy = 10000;// 及把给定区域10000等分
double dPart = (b - a) / 10000;
double dTotalArea = 0;
//循环求面积
for(int iPartNum = 1; iPartNum <= iAccuracy; iPartNum ++ )

//一个梯形面积 (上底加下底)* 高 /2
double dArea = ( fun(a) + fun(a+dPart) ) * dPart /2;
a+=dPart;
dTotalArea += dArea;

//返回所求积分
return dTotalArea;

//函数取一个做示范 其余类似
double func1(double x)

return (x + 1);

117.求定积分

#include "stdio.h"
#include "math.h"


double fsimpf(x) /*要进行计算的被积函数*/
double x;

	double y;
    y=log(1.0+x)/(1.0+x*x);
    return(y);


double fsimp(a,b,eps) /*辛普森算法*/
double a,b,eps; /*a为积分下限,b为积分上限,eps是希望达到的精度*/

    int n,k;
    double h,t1,t2,s1,s2,ep,p,x;
    n=1; h=b-a;
    t1=h*(fsimpf(a)+fsimpf(b))/2.0;  /*用梯形公式求出一个大概的估值*/
    s1=t1;
    ep=eps+1.0;
    while (ep>=eps)
	
		/*用梯形法则计算*/
		p=0.0;
		for (k=0;k<=n-1;k++)
		
			x=a+(k+0.5)*h;
			p=p+fsimpf(x);
		
		t2=(t1+h*p)/2.0;
		/*用辛普森公式求精*/
		s2=(4.0*t2-t1)/3.0;
		ep=fabs(s2-s1);
		t1=t2; s1=s2; n=n+n; h=h/2.0;
	
    return(s2);

main()

	double a,b,eps,t;
        a=0.0; b=1.0; eps=0.0000001;
    	clrscr();
	puts("**********************************************************");
	puts("*         This program is to calculat the Value of       *");
	puts("*          a definite integral by Simpson Method.        *");
	puts("**********************************************************");
    	t=fsimp(a,b,eps);
	puts("\\n----------------------------------------------------------");
	printf(" >> The result of definite integral is : \\n");
	printf(" >> SIGMA(0,1)ln(1+x)/(1+x^2)dx = ");
    	printf("%e\\n",t);
    	puts("----------------------------------------------------------");
    	printf("\\n Press any key to quit...");
	getch();

以上是关于急!!!利用函数指针变量编写一个求定积分的通用函数,的主要内容,如果未能解决你的问题,请参考以下文章

c语言 求定积分的通用函数

用C语言编写一个求定积分的程序

C语言求函数定积分

matlab求定积分和不定积分

急!!![80分]求一C语言程序

求三道用mathematica求最值的代码~~急~~~!!!