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

这篇具有很好参考价值的文章主要介绍了用C语言实现定积分求解的三种方法,梯形公式,辛普森公式,自适应辛普森公式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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.1415926

double 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;
}

可以用指针来初步优化这个代码:文章来源地址https://www.toymoban.com/news/detail-735037.html

#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语言实现定积分求解的三种方法,梯形公式,辛普森公式,自适应辛普森公式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【C语言】判断字符类型的三种方法

    【C语言】判断字符类型的三种方法

    🦄 个人主页 :修修修也 🎏 所属专栏 :C语言 ⚙️ 操作环境 : Visual Studio 2022 目录 一.字符的类型分类 1.ASCII的定义:  2.ASCII的产生原因是: 3.ASCII的内容: 二.字符类型判断相关库函数 1.isdigit(),用于判断字符是否为数字。 2. isalpha(),用于判断字符是否为字母。 3. isalnum(),用

    2024年02月06日
    浏览(8)
  • C语言素数(质数)判断的三种方法

    本文介绍了判断素数的3种方法,从素数的概念分析,确定找到素数的几个必要条件,设计思路,并将代码进行优化。此外,还使用自定义函数的形式将同样的思路进行实现。 素数,就是仅能被自身和1整除的数字。 首先我们可以提取出判断素数的三个基本条件: 素数是整数

    2024年02月04日
    浏览(5)
  • C语言笔记——结构体的三种打印方法

    C语言笔记——结构体的三种打印方法

    (看鹏哥C语言视频学的,自己做的笔记) 首先定义一个结构体(以学生的信息为例): 第一种 打印方法: 注意:age要对应%d,其余都是%s,其余三个顺序换了无所谓。 运行结果:   第二种 打印方法(函数+地址): 第三种 打印方法(与第二种方法类似,用箭头表示而已)

    2024年02月02日
    浏览(9)
  • 【C语言】字母转换大小写的三种方法

    【C语言】字母转换大小写的三种方法

    🦄 个人主页 :修修修也 🎏 所属专栏 :C语言 ⚙️ 操作环境 : Visual Studio 2022 目录 方法一:库函数法 📌小写转换大写:toupper()函数 📌大写转换小写:tolower()函数 方法二:加减32法 📌小写转换大写:字符数据减32 📌大写转换小写:字符数据加32 方法三:位运算法 📌大小写

    2024年02月09日
    浏览(291)
  • 【C语言】scanf多组输入的三种方法!

    【C语言】scanf多组输入的三种方法!

    🎬 鸽芷咕 :个人主页  🔥 个人专栏 :《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活!    🌈 hello! 各位宝子们大家好啊,相信大家都多多少少了用过scanf语句吧,但是对scanf函数没有全面的认识仅仅只是知道可以输入。    ⛳️ 今天博主就给大

    2024年02月06日
    浏览(9)
  • C语言判断素数的三种方法 判断素数(质数)

    C语言判断素数的三种方法 判断素数(质数)

    题目: 方法一:在2到n-1之间任取一个数,如果n能被整除则不是素数,否则就是素数 代码示例如下: 代码运行结果如下: 方法二:在2到n/2之间任取一个数,如果n能被整除则不是素数,否则就是素数  代码示例如下: 代码运行结果如下: 方法三:在2到sqrt(n)之间任取一个数,如

    2024年02月02日
    浏览(9)
  • C语言判断一个数是否为素数的三种方法(详细)

             今天我们来使用C语言来实现判断一个数是否为素数,首先我们需要了解到素数的概念,素数就是只能被1和它本身整除的数。             这是第一种代码,我们来分析一下,首先创建变量i和n,这里我们i用于循环,n用来存放我们输入的数字。之后我们设置一个

    2024年04月25日
    浏览(7)
  • 快速排序的三种实现方法

    快速排序的单趟排序 快速排序的单趟排序:是以一个数作为基准值,实现将数组中比基准数小的数放在基准值的左侧,比基准值大的数放在基准值的右侧。 方法一:霍尔法 霍尔法的由来:霍尔是一个人的名字,他是最初发现快速排序的人,所以,它使用的单趟排序算法被称为

    2024年01月25日
    浏览(6)
  • c语言大小写字母转换的三种方法 到 思考指针(超详细)

    目录 前言 总结摆在前面 1.指针思考的拓展 2.浅提一下表达式求值  三种方法 1.利用ASCII相差32 1.1以表达式求值的思考方式 1.2以指针的方式 2.通过按位异或来求(我觉得太巧合了,不推荐) 3.通过库函数(这个看你积累) 3.1  tolower函数——转换字符位小写 定义 参数 返回值

    2024年02月19日
    浏览(337)
  • QR分解的三种方法和实现过程

    QR分解的三种方法和实现过程

    在解最小二乘问题 m i n ∣ ∣ A x − b ∣ ∣ min||Ax-b|| min ∣∣ A x − b ∣∣ 时,将其转化成 A T A x = A T b A^{T}Ax=A^{T}b A T A x = A T b 之后该问题就是一个求解线性方程组的问题。最简单的求解线性方程组方法是高斯消去,但是有时高斯消去会增大方程的条件数,这时我们可以用正交

    2024年02月07日
    浏览(6)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包