1.梯形公式:

梯形公式(trapezoidal rule)是一种求定积分的方法。它假定函数在区间上是一条直线,因此可以通过计算梯形的面积来估计函数的定积分

#include<stdio.h>
#include<math.h>double f(double x)
{return sin(x);//所需要求定积分的函数
}double Trapz(double a, double b, int n)
{double h = (b - a) / n;double sum = 0;for (int i = 1; i < n; i++)sum += f(a + i * h);return h * (f(a) + f(b)) / 2 + h * sum;
}int main()
{printf("%lf\n", Trapz(0, 3.1415926, 100));//积分下限,积分上限,精度return 0;
}

可以用指针来初步优化这个代码:

#include<stdio.h>
#include<math.h>double f(double x)
{return sin(x);//所需要求定积分的函数
}double Trapz(double a, double b, int n)
{double h = (b - a) / n;double sum = 0;double* p;p = &a;for (int i = 1; i < n; i++){*p = *p + h;sum += f(*p);}return h * (f(a) + f(b)) / 2 + h * sum;
}int main()
{printf("%lf\n", Trapz(0, 3.1415926, 100));//积分下限,积分上限,精度return 0;
}

2.辛普森公式:

辛普森公式(Simpson's rule)是一种求定积分的方法。它是由英国数学家 Thomas Simpson 在 18世纪末发明的。辛普森公式假定函数在区间上为二次函数,因此能够更精确地计算函数的定积分。

#include <stdio.h>
#include <math.h>
#define PI 3.1415926double Simpson(double a, double b, int n, double(*f)(double x))
{double h = (b - a) / n;double sum1 = 0, sum2 = 0;int i;for (i = 1; i <= n - 1; i += 2)sum1 += f(a + i * h);for (i = 2; i <= n - 2; i += 2)sum2 += f(a + i * h);return h / 3 * (f(a) + 4 * sum1 + 2 * sum2 + f(b));
}double f(double x)
{return sin(x);
}int main()
{double s = Simpson(0, PI, 100, f);//积分下限,积分上限,精度,函数printf("The result of integral is %lf\n", s);return 0;
}

3.adaptive Simpson's rule:

自适应辛普森公式(adaptive Simpson's rule)是一种求定积分的方法,它的基本思想是将定积分的区间分成若干个小区间,然后使用辛普森公式对每个小区间求解,最后将所有小区间的定积分求和得到整个区间的定积分。

#include <stdio.h>
#include <math.h>double f(double x)
{return sin(x);
}double adaptive_simpson(double a, double b, double d)
{double c = a + (b - a) / 2;double l = (f(a) + 4 * f(c) + f(b)) * (b - a) / 6;double r = (f(a) + 4 * f((a + c) / 2) + 2 * f(c) + 4 * f((c + b) / 2) + f(b)) * (b - a) / 12;if (fabs(l - r) <= 15 * d)return r + (r - l) / 15;return adaptive_simpson(a, c, d) + adaptive_simpson(c, b, d);
}int main()
{double a = 0;//积分下限double b = 3.14159265;//积分上限double d = 0.000001;//精度printf("%.6f\n", adaptive_simpson(a, b, d));return 0;
}

可以用指针来初步优化这个代码:

#include <stdio.h>
#include <math.h>double f(double x)
{return sin(x);
}double adaptive_simpson(double* a, double* b, double* d)
{double c = *a + (*b - *a) / 2;double l = (f(*a) + 4 * f(c) + f(*b)) * (*b - *a) / 6;double r = (f(*a) + 4 * f((*a + c) / 2) + 2 * f(c) + 4 * f((c + *b) / 2) + f(*b)) * (*b - *a) / 12;if (fabs(l - r) <= 15 * *d)return r + (r - l) / 15;return adaptive_simpson(a, &c, d) + adaptive_simpson(&c, b, d);
}int main()
{double a = 0;//积分下限double b = 3.14159265;//积分上限double d = 0.000001;//精度printf("%.6f\n", adaptive_simpson(&a, &b, &d));return 0;
}

用C语言实现定积分求解的三种方法,梯形公式,辛普森公式,自适应辛普森公式相关推荐

  1. c语言数组最大可定义多少位_C语言求数组的最大值三种方法

    /* 黄哥Python培训 黄哥所写*/#include int maxValue(int* arr, int n);int maxRecursionValue(int* arr, int n);in ...

  2. 【C语言】输出闰年的三种方法

    系列文章目录 C语言基础整体框架(二)http://t.csdn.cn/QyW6l C语言基础整体框架(二)http://t.csdn.cn/BqPr5 猜数字游戏--分支循环 http://t.cs ...

  3. C语言求最大公约数的三种方法

    最大公约数是两个数可以同时整除的数中最大的那个 这里用三种方法来解决 穷举法求最大公约数 判断x和y的最大公约数,x和y其中一定有一个相对较小的数,然后从这个较小数开始遍历,不断地用x和y去除这个数, ...

  4. c语言求字符串长度的三种方法(部分略微优化)

    求字符串的长度,很多人都会直接想到用strlen函数,只需要头文件string.h就可以很轻松的实现,但对于我们c语言的初学者,也应该尝试用其他方法来进行实现,除了strlen函数外有三种方法可供参考 ...

  5. c语言位操作大小写转换,C语言实现大小写转换的三种方法

    今天心血来潮,总结了下大小写转换的方法,大致有三种. 1.使用C语言提供的函数:toupper(),tolower() 使用这两个函数需要引入头文件:#include 示例代码: #include # ...

  6. 阶乘求和 C语言实现求阶乘之和 三种方法实现 先阶乘再累加

    题目: 此处题目是以1-20的阶乘之和举例 方法一:使用一层for循环实现 代码简单快捷容易理解 代码示例如下: #include<stdio.h> int main() {double ...

  7. Go语言逐行读取文件的三种方法

    Go语言有三种逐行读取文件的方法,依次是 ReadString func (b *Reader) ReadString(delim byte) (string, error)ReadString从输入 ...

  8. Go语言拼接URL路径的三种方法

    Go语言拼接URL路径有多种方法建议用ResolveReference. JoinPath JoinPath会把多个多个路径合并成一个路径,并且处理../和./,多个//合并成单个/. package ...

  9. c语言中文如何大小写转换器,C语言实现大小写转换的三种方法

    今天心血来潮,总结了下大小写转换的方法,大致有三种. 1.使用C语言提供的函数:toupper(),tolower() 使用这两个函数需要引入头文件:#include 示例代码: #include # ...

最新文章

  1. 百度地图应用开发(一)
  2. android仿苹果SwitchButton效果的实现
  3. python动态改变标签的颜色_PyQt4 treewidget 选择改变颜色,并设置可编辑的方法
  4. 表的转置 行转列: DECODE(Oracle) 和 CASE WHEN 的异同点
  5. 使用WTMPlus快速搭建发卡网
  6. java join 源码_java并发:join源码分析
  7. 深圳大学计算机考研复习资料百度云,深圳大学(专业学位)计算机技术研究生考试科目和考研参考书目...
  8. KDD'21 | FaceBook :基于图的负采样方法
  9. windows下执行tensorflow/models的代码显示No module named ‘object_detection‘
  10. C语言猜数字游戏代码实现
  11. 《OpenDRIVE1.6规格文档》1
  12. python生成器详解
  13. MPU6050六轴传感器
  14. 微信公众号python开发_基于Python的微信公众平台二次开发(Python常用框架、订阅号开发、公众号开发)...
  15. mint-ui引用iconfont图标
  16. 儿童摄影html代码源,HTML5织梦dede儿童摄影/影楼/写真/摄影工作室网站模板
  17. antd里面select组件mode为tags时,输入重复按回车键做保留处理
  18. php 微信 语音,微信语音的上传与下载功能实现详解
  19. PHP给title=赋值变量 PHP title弹出字符串拼接变量
  20. Java就业方向有哪些?学习Java开发能做什么?

热门文章

  1. 2023年“网络安全”赛项安徽省阜阳市选拔赛任务书
  2. Debian安装后没有没有Intel Wireless驱动,无法开启WiFi
  3. java策略案例国王,骑士_实例说明策略模式
  4. 科普向】Nexus 4 必读与常见问题解答【Android入门读
  5. MS SQL Server2012中的EOMONTH函数
  6. AudioRecord READ_BLOCKING 与 READ_NON_BLOCKING的区别
  7. 不使用接口的方式获取数据(登录无验证码)
  8. 一、三大基础随机分布与数学特征
  9. 入手arduino和W5100和乐为物联
  10. Python中的条件表达式