链接:https://blog.csdn.net/chen_dsir/article/details/71257631 博主详细介绍了复合梯形公式,链接:https://wenku.baidu.com/view/b300c53deefdc8d376ee3228.html 详细介绍了变步长的目的,以及变换的方式下面...
链接:https://blog.csdn.net/chen_dsir/article/details/71257631 博主详细介绍了复合梯形公式,
链接:https://wenku.baidu.com/view/b300c53deefdc8d376ee3228.html 详细介绍了变步长的目的,以及变换的方式
下面求解如下问题:

1、变步长:
由于多数情况下,并不知道步长设置为多少合适,所以我们可以设置一个初始步长,求解一次,再把步长变为原来的一半,依次接下去,直到达到我们所需的精度。
2、代码:
#include<stdio.h>
#include<math.h>
#define left 1.0 //左端的值
#define right 3.0 //右端的值
#define precision 0.0001 //定义精度
double f(double x)
{
double m=100/(x*x)*sin(10/x);
return m;
}
int main()
{
int i;
int step=100; //初始化步数
double stepLength=(right-left)/step; //步长
double T=f(left)+f(right); //积分的值
for(i=1;i<=step-1;i++)
{
double x=left+i*stepLength;
T+=2*f(x);
}
T=stepLength/2*T; //符合梯形公式求解结果
printf("初始步长得到的积分值:%lf 所分的区间个数:%d\n",T,step);
//下面改变步长,来细化精度
double T1=T+100;
double T2=T;
double H; //减小步长后得到的积分值
while(fabs(T1-T2)>precision/2)
{
T1=T2;
step=step*2;
stepLength=(right-left)/step;
H=0;
for(i=1;i<step;i++)
{
H+=2*f(left+stepLength*i);
}
H=f(left)+f(right)+H;
H=H*stepLength/2;
T2=(T1+H)/2; //将上次一的积分结果和减小步长后的积分结果求均值
}
printf("初始步长得到的积分值:%lf 所分的区间个数:%d\n",T2,step);
}
3、结果:

4、验证:

沃梦达教程
本文标题为:C语言实现变步长求积分算法
基础教程推荐
猜你喜欢
- 漫画讲解C语言中最近公共祖先的三种类型 2023-01-01
- 使用VS2022开发在线远程编译部署的C++程序(图文详解) 2023-01-15
- C语言实现简易停车场管理系统 2023-03-13
- 如何告诉 MinGW 链接器不要导出所有符号? 2022-10-07
- C语言文件操作与相关函数介绍 2023-06-13
- C++高级数据结构之并查集 2023-04-20
- C/C++ Qt StatusBar底部状态栏应用教程 2023-01-10
- 使用C/C++读写.mat文件的方法详解 2023-03-05
- C++类和对象到底是什么 2022-11-12
- C语言预编译#define(预处理) 2023-04-03
