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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用C语言编写一个求定积分的程序相关的知识,希望对你有一定的参考价值。

用C语言编写一个求定积分的通用函数,用它分别求以下5个函数的定积分:∫ab (1+x)dx , ∫ab (2x+3)dx , ∫ab (ex+1)dx , ∫ab (1+x)2dx , ∫ab x3dx 。其中,a,b为积分上下限,数值待定。

这是辛普森积分法。
给你写了fun_1( ),fun_2(),请自己添加另外几个被积函数。
调用方法 t=fsimp(a,b,eps,fun_i);
a,b --上下限,eps -- 迭代精度要求。
#include<stdio.h>
#include<stdlib.h>
#include <math.h>
double fun_1(double x)

return 1.0 + x ;

double fun_2(double x)

return 2.0 * x + 3.0 ;


double fsimp(double a,double b,double eps, double (*P)(double))

int n,k;
double h,t1,t2,s1,s2,ep,p,x;
n=1; h=b-a;
t1=h*(P(a)+P(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+P(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);

void main()

double a,b,eps,t;
a=0.0; b=3.141592653589793238; eps=0.0000001;
// a definite integral by Simpson Method.
t=fsimp(a,b,eps,fun_1);
printf("%g\n",t);
t=fsimp(a,b,eps,fun_2);
printf("%g\n",t);
// ...
printf("\n Press any key to quit...");
getch();
追问

程序可以运行,但是看不懂fsimp函数。
所以,我将fsimp函数修改了一下:
double fsimp(double a,double b,double (*p)(double))

double c,s;
c=(a+b)/2;
s=(b-a)/6*(p(a)+4*p(c)+p(b));
return s;

追答

变步长辛普森公式,看懂是难一点,但速度快,不因a,b范围变化 使精度变化。

参考技术A #include<stdio.h>
#include<math.h>

int main ()

float integral(float a,float b,float (*p)(float,float));
float a,b;
printf("please enter a and b:\n");
scanf("%f%f",&a,&b);
int n;
float f1(float,float );
float f2(float,float );
float f3(float,float );
printf("please choose 1,2or3:\n");
scanf("%d",&n);
if(n==1) integral(a,b,f1);
if(n==2) integral(a,b,f2);
if(n==3) integral(a,b,f3);
return 0;


float integral( float a,float b,float(*p)(float ,float)) //定义


float result;
result=(*p)(a,b); //调用
printf(" %5.2f \n",result);

return 0;

float f1(float x,float y)

float y0,y1,y2;

y1=x*x*0.5+x;
y2=y*y*0.5+y;
y0=y2-y1;
printf("(1+x)的积分为result1:=\n");
return y0;


float f2(float x,float y)

float y0,y1,y2; //y2作为原函数的下限的值,y1作为原函数的上限的值,差为y0 作为结果返回
y1=x*x+3.0*x;
y2=pow(y,2)+3.0*y; //y的平方
y0=y2-y1;
printf("(2x+3)的积分为result2:=\n");
return y0;

float f3(float x,float y)

float y0,y1,y2;
y1=exp(x)+x;
y2=exp(y)+y;
y0=y2-y1;
printf("(exp(x)+1)的积分为result3:\n");
return y0;
参考技术B #include<stdio.h>
#include<math.h>
float
f1(float
x)

return(1.0+x);

float
f2(float
x)

return(2.0*x+3.0);

float
f3(float
x)

return(exp(x)+1);

float
f4(float
x)

return(pow(1+x,2));

float
f5(float
x)

return(pow(x,3));

float
fsimp(float
a,float
b,float
(*p)(float))

float
c,s;
c=(a+b)/2;
s=(b-a)/6*(p(a)+4*p(c)+p(b));
return
s;

int
main()

float
a,b;
printf("请输入积分下限a的值:");
scanf("%f",&a);
printf("请输入积分上限b的值:");
scanf("%f",&b);
printf("%f\n",fsimp(a,b,f1));
printf("%f\n",fsimp(a,b,f2));
printf("%f\n",fsimp(a,b,f3));
printf("%f\n",fsimp(a,b,f4));
printf("%f\n",fsimp(a,b,f5));
参考技术C 用小小梯形法。
即i从-PI/2开始,一直以一个较小的量加上去,加到PI
/2为止,对于每一个量应用上的积分元算出结果,加起来就行了。

求解释一个C语言程序

题目是:读取正整数m和n(假定它们满足m>=n>0),显示所有从集合1,2,…,m中取出的n个数的组合。例如,若m=3,n=2,则可以按以下形式之一显示:
3 2
3 1
2 1

#include<stdio.h>
#include<string.h>
int ans[10];
int m, n;
void DFS(int d, int p)

int i;
if(d == n)

for(i = 0; i < n; i++)
printf("%d ", ans[i]);
printf("\n");
return ;

for(i = p+1; i <= m; i++)

ans[d] = i;
DFS(d+1, i);


int main()

scanf("%d %d", &m, &n);
DFS(0, 0);
return 0;


这个递归实在是看不懂,求解释思路。多加点注解,以及解释一下各个字母以及关键数字的含义好吗?
for(i = p+1; i <= m; i++)

ans[d] = i;
DFS(d+1, i);

主要就是这里不懂。还有DFS的两个参数是什么意思。

#include <stdio.h>
#include <string.h>
int ans[10];
int m, n;
void DFS(int d, int p) // 需要第d个数,按顺序 从 p + 1 到 m 中选择

    int i;
    if (d == n)  // 如果已选出 n 个数,就输出
        for (i = 0; i < n; i++)
            printf("%d ", ans[i]);
        printf("\\n");
        return;
    
    for (i = p + 1; i <= m; i++) 
        ans[d] = i; // 选择 第 d 个数为 p +1 到 m , 假设选择了 x 
        DFS(d + 1, i); // 继续选择 第 d + 1 个数, 则选择范围是 x + 1 到 m
    

int main()

    scanf("%d %d", &m, &n);  // 输入两个数 m, n
    DFS(0, 0); // 第一个是 选出个数, 
    return 0;

解释下哦:

比如 m = 3, n = 2;

首先调用  DFS(0, 0) 需要第 0 个数,选择范围从 0 + 1 到 m(3),

然后进入 for 循环 i = 0 + 1, 因此第一个数选择1, 

继续 调用 DFS(1, 1) 需要第 1 个数,选择范围从 1 + 1 到 m(3), 

然后进入新函数的循环 i = 1+1,因此第二个数选择 2 ,

继续 调用 DFS(2, 2) 需要第 2 个数,由于 2 等于n, 表明选择完成,输出 ( 1, 2)

退出函数DFS(2,2) 退回到 DFS(1, 1) 的下一个 for 循环:

循环 i = 2+1,因此第二个数选择 3 , 

继续 调用 DFS(2, 3) 需要第 2 个数,由于 2 等于n, 表明选择完成,输出 ( 1,3)

退出函数DFS(2,3) 退回到 DFS(1, 1) 的下一个 for 循换,循环条件不满足,DFS(1, 1) 执行结束返回到  DFS(0, 0) 继续执行 循环:

i = 1 + 1, 因此第一个数选择2,  

继续 调用 DFS(1, 2) 需要第 1 个数,选择范围从 2 + 1 到 m(3), 

然后进入新函数的循环 i = 2+1,因此第二个数选择 3 ,

继续 调用 DFS(2, 3) 需要第 2 个数,由于 2 等于n, 表明选择完成,输出 ( 2, 3)

退出函数DFS(2,3) 退回到 DFS(1, 2) 的下一个 for 循环: 循环条件不满足,DFS(1, 1) 执行结束返回到  DFS(0, 0) 继续执行 

i = 2 + 1因此第一个数选择3,  

继续 调用 DFS(1, 3) 需要第 1 个数,选择范围从 3 + 1 到 m(3),  很明显这里的循环将不能执行,因为循环条件是假的,因此退出 DFS(1, 3) 返回到 DFS(0, 0) 继续执行 循环:循环条件不满足。返回到 主程序 main

执行结束。

参考技术A escsew_'_beppeps:# 参考技术B 第一个
main()

inta=1,b=4,c=2;
//给整数a,b,c赋值
float
x=10.5,y=2.0,z;
//给小数x,y赋值,申明小数z
z=(a+b)/c+sqrt((double)y)*1.2/c+x;
//计算z的算式:sqrt表示开根号,要加#include(stdio.h)才能用,(double)表示把y强制类型转换成double型,*表示乘法,/表示除法
printf(“%f\n".z);//输出浮点数z

第二个
m=(k+=i*=k);
赋值语句结合顺序是从右往左结合:最右边i*=k
是i=i*k的简写,计算结果i=2*2=4;同理,k+=i是k=k+i;计算结果k=2+4=6最后m=k;所以m=6;

以上是关于用C语言编写一个求定积分的程序的主要内容,如果未能解决你的问题,请参考以下文章

编写一个求定积分的通用函数,用它分别求以下几个积分:

用C语言求定积分

C语言求函数定积分

C语言如何求定积分?

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

matlab求定积分和不定积分