求定积分的方法有很多种,下面是我总结的几种比较常用的方法。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h> #define N 3 double fun(double x)
{
double y; y = sqrt(4-(x)*(x));
//y = sin(x); return y;
} /*随机点法求定积分*/
double Darts(int n)
{
double x, y;
time_t t;
int i = 0;
int count = 0; srand((unsigned)time(&t)); for (i=0; i<n; i++)
{
x = rand()%100/100.0;
y = rand()%100/100.0; if (y <= 1-pow(x,2))
{
count++;
}
} return (double)count/(double)n;
} /*左矩形法求定积分*/
double LeftRect(double down, double up, int n)
{
double h, s;
int i; /*计算步长*/
h = (up-down)/n; s = fun(down)*h; for (i=1; i<n; i++)
{
s = s + fun(down+i*h)*h;
} return s;
} /*梯形公式求定积分*/
double Trape(double down, double up, int n)
{
double h, s;
int i = 0; /*计算步长*/
h = (up-down)/n; s = 0.5*(fun(down)+fun(down+h))*h; for (i=1; i<n; i++)
{
s = s + 0.5 * (fun(down+i*h) + fun(down+(i+1)*h))*h;
} return s;
} /*复合梯形公式*/
double T(double x, double y, int z)
{
double h, Tn;
int i = 0; h = (y-x)/z;
Tn = (fun(x)+fun(y))/2; for (i=0; i<z; i++)
{
Tn = Tn+fun(x+i*h);
} Tn = Tn*h; return Tn;
} /*辛普生公式求定积分,公式为: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[1]={0.0};
float A1[1]={2};
float x2[2]={-0.5573503,0.5573503};
float A2[2]={1,1};
float x3[3]={-0.7745967,0.0,0.7745967};
float A3[3]={0.555556,0.888889,0.555556};
float x4[4]={0.3399810,-0.3399810,0.8611363,-0.8611363};
float A4[4]={0.6521452,0.6521452,0.3478548,0.3478548};
float x5[5]={0.0,0.5384693,-0.5384693,0.9061799,-0.9061799};
float A5[5]={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;
}

最新文章

  1. HTTP 错误 404.3 – Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。
  2. C++结构体内存对齐跨平台测试
  3. spring-data-jpa 方法名关键字的命名规范
  4. vmware下的linux的host only上网配置
  5. 来自于2016.2.24的flag
  6. 说不尽的MVVM(5) - 消息满天飞
  7. vs2010 clickone 工程安装后的路径 win7
  8. 设计模式之中介者模式(Mediator)
  9. 静态wenb开发,动态web开发
  10. UILabel文本垂直顶部对齐的方法
  11. 消息对话框(MessageBox)用法介绍
  12. hdu5573 二叉树找规律,二进制相关
  13. js原生拓展网址——mozilla开发者
  14. 如何查看chrome浏览器已保存的密码
  15. eclipse部署项目到tomcat
  16. 【Ansible 文档】【译文】Playbooks 变量
  17. mysql数据库的test类型
  18. go语言之行--结构体(struct)详解、链表
  19. GPUImage API文档之GPUImageFramebufferCache类
  20. python网络爬虫 - 如何伪装逃过反爬虫程序

热门文章

  1. ng1中 如何用双向绑定 实现单向绑定的初始时不显示双括号效果?
  2. 解决Android Studio启动速度慢的问题。避免每次启动Android Studio都要fetching Android sdk compoment information。
  3. UVA 10795 A Different Task(汉诺塔 递归))
  4. ubuntu logout 命令
  5. jsp 嵌套iframe 从iframe中表单提交并传值到外层
  6. wap开发笔记之幻灯片
  7. Mac苹果电脑加密视频播放器使用教程
  8. HTML实体
  9. python連接mysql數據庫
  10. thinkPHP add、save无法添加、修改不起作用