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