用梯形法求定积分,通过函数调用求sin(x),exp(x)和x/(1-x*x)在a,b上的定积分

如此美丽的你 2011-04-23 12:00:23
用梯形法求定积分,通过函数调用求sin(x),exp(x)和x/(1-x*x)在a,b上的定积分看看那里错了哈!!!!
代码如下:
#include<stdio.h>
#include<math.h>
float fun1(float x);
float fun(float a,float b,float (*f)(float x));
void main()
{ float a, b;
printf("请输入sin(x)积分的上下限\n");
scanf("%f%f",&a,&b);
printf("sinx在%f->%f的定积分=%f\n",a,b,fun(a,b,sin));
printf("请输入exp(x)积分的上下限\n");
scanf("%f%f",&a,&b);
printf("exp(x)在%f->%f的定积分=%f\n",a,b,fun(a,b,exp));
printf("请输入函数x/(1-x*x)积分的上下限\n");
scanf("%f%f",&a,&b);
printf("函数x/(1-x*x)在%f->%f积分=%f\n",a,b,fun(a,b,fun1));
}
float fun(float a,float b,float (*f)(float x))
{ int i,n;
float s,h;
printf("请输入积分区间的分割数\n");
scanf("%d",&n);
h=(b-a)/n;
s=*f(a)+*f(b);
for(i=1;i<n;i++)
s+=*f(a+i*h);
return s;
}
float fun1(float x)
{ return x/(1-x*x);
}
...全文
781 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
pathuang68 2011-04-23
  • 打赏
  • 举报
回复
编译通过,仅供参考。

#include <stdio.h>
#include <math.h>

#define N 1000 // 划分1000等分,这个也可以设定为参数,简单点就这样吧。

double f1(double x) // 被积分的函数: sin(x)
{
return sin((double)x);
}

double f2(double x) // 被积分的函数: exp(x)
{
return exp((double)x);
}

double f3(double x) // 被积分的函数: x/(1-x*x)
{
return x/(1-x*x);
}

typedef double (*fptr)(double); // 定义一个函数指针类型fptr,用于指向被积分的函数

double calculate(fptr f, double lower, double upper) // 计算积分。f = 被积分的函数, lower积分下限,upper积分上限
{
double t = 0.0; // 步长
double h = 0.0; // 高度
double result = 0.0; // 积分结果
t = (upper - lower) / N; // 先把步长计算出来
for(int i = 0; i < N; ++i) // 算面积并求和
{
h = (f(lower + i * t) + f(lower + (i + 1) *t) / 2);
result += t * h;
}

return result;
}
int main(int argc,char* argv)
{
double lower = 0.1; // 设定积分下限
double upper = 0.9; // 设定积分上限
printf("Integral of sin(x) between %lf and %lf is: %lf\n", lower, upper, calculate(f1, lower, upper));
printf("Integral of exp(x) between %lf and %lf is: %lf\n", lower, upper, calculate(f2, lower, upper));
printf("Integral of x/(1-x*x) between %lf and %lf is: %lf\n", lower, upper, calculate(f3, lower, upper));
return 0;
}


还要注意,计算x/(1-x*x)的积分的时候,当x = 1的时候的溢出,这样的问题楼主自己解决吧。
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<math.h>


float fun(float a,float b,float (*f)(float x));

void main()
{
float a, b;

printf("请输入sin(x)积分的上下限\n");
scanf("%f%f",&a,&b);
printf("sinx在%f->%f的定积分=%f\n",a, b, fun(a, b, sin));

//printf("请输入exp(x)积分的上下限\n");
//scanf("%f%f",&a,&b);
//printf("exp(x)在%f->%f的定积分=%f\n",a, b, fun(a,b,exp));

//printf("请输入函数x/(1-x*x)积分的上下限\n");
//scanf("%f%f", &a, &b);
//printf("函数x/(1-x*x)在%f->%f积分=%f\n", a, b, fun(a,b,fun1));
}

float fun(float a,float b,float (*f)(float x))
{
int i, n;
float s = 0, h;
float y1, y2 ;

printf("请输入积分区间的分割数\n");
scanf("%d", &n);

h = (b - a) / n; //每份的长度

y1 = (*f)(a) ; //小区间下限处对应的函数值
for (i=1; i<n; i++)
{
b = a + h ; //小区间的上限
y2 = (*f)(b) ; //小区间的上限处对应的函数值
s += (y1 + y2) / 2 ;
a = b ;
y1 = y2 ; //注意这点
}
return s;
}
这只是其中 的部分,你看看吧!还有楼主啊,平时练习就应该多注意你的代码风格。我的虽然不好,可至少让人看着不至于头晕晕的。要适应的缩进和空格啊!
  • 打赏
  • 举报
回复
printf("请输入积分区间的分割数\n");
scanf("%d",&n);
h=(b-a)/n;
s=*f(a)+*f(b); //改成s = (*f)(a) + (*f)(b);这里有错的,指针函数你没有掌握好
for(i=1;i<n;i++)
s+=*f(a+i*h);

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧