简介
先考察一个子段[xk,xk+1][x_k,x_{k+1}][xk,xk+1],其中点xk+12=12(xk+xk+1)x_{k+\frac{1}{2}}=\frac{1}{2}(x_k+x_{k+1})xk+21=21(xk+xk+1),在该子段上二分前后的两个积分值T1=h2[f(xk)+f(xk+1)]T2=h4[f(xk)+2f(xk+12)+f(xk+1)]T_1 = \frac{h}{2}[f(x_k)+f(x_{k+1})]\\ T_2 = \frac{h}{4}[f(x_k)+2f(x_{k+\frac{1}{2}})+f(x_{k+1})]T1=2h[f(xk)+f(xk+1)]T2=4h[f(xk)+2f(xk+21)+f(xk+1)]
显然有下列关系T2=12T1+h2f(xk+12)T_2 = \frac{1}{2}T_1 + \frac{h}{2}f(x_{k+\frac{1}{2}})T2=21T1+2hf(xk+21)
将此关系式关于kkk从000到n−1n-1n−1累加求和,即可导出下列递推公式
T2n=12Tn+h2∑k=0n−1f(xk+12)T_{2n} = \frac{1}{2}T_n + \frac{h}{2}\sum_{k=0}^{n-1}f(x_{k+\frac{1}{2}})T2n=21Tn+2hk=0∑n−1f(xk+21)并强调其中h=b−anh=\frac{b-a}{n}h=nb−a是二分前的步长,而xk+12=a+(k+12)hx_{k+\frac{1}{2}}=a + (k + \frac{1}{2})hxk+21=a+(k+21)h
给出代码
#include <iostream>
#include <cmath>
using namespace std;
double f(double x){
if (x == 0) {
return 1;
}
return sin(x)/x;
}
int main(int argc, const char * argv[]) {
double a, b, epsilon;
cout<<"请依次输入积分区间[a,b], 允许误差epsilon"<<endl;
cin>>a>>b>>epsilon;
double h = b - a;
double T1 = (f(a) + f(b)) * h / 2;
double T2 = INFINITY;
double S, x;
bool flag = false;
do{
if (flag) {
h /= 2;
T1 = T2;
}
S = 0;
x = a + (h / 2);
while (x < b) {
S += f(x);
x += h;
}
T2 = (S * h / 2) + (T1 / 2);
flag = true;
}while(fabs(T2 - T1) >= 3 * epsilon);//误差的事后估计
cout<<T2<<endl;
}
这篇博客介绍了梯形递推公式,通过在子段[xk, xk+1]上的积分值关系,推导出递推公式:T2n = 21Tn + 2hk=0∑n−1f(xk+21),其中h是二分前的步长。文章还提及了算法实现的相关代码。"
120804512,10909777,深度学习与空气质量预测:模型比较与应用,"['深度学习', '环境科学', '空气质量', '模型预测', 'LSTM模型', 'CNN模型']
2176

被折叠的 条评论
为什么被折叠?



