// wangdiedang is a good guy! =v=
#define _USE_MATH_DEFINES
#include<iostream>
#include<vector>
#include<cmath>
#include<fstream>
#include<iomanip>
using namespace std;
vector<vector<double>> romG(20, vector<double>(20));
double z(double x) {
if (x != 0) return sin(x) / x;
else return 1;
/*double b = 0.1;
return pow(1 - (pow(b, 2) * pow(cos(x), 2)), 0.5);*/
}
double formula3_4(double k, double ul, double ll, double target) {
double sum = 0;
for (int j = 0; j <= pow(2, k - 1) - 1; j++) sum += z(ll + (2 * j + 1) * (ul - ll) / pow(2, k));
return target / 2 + (ul - ll) / pow(2, k) * sum;
}
double formula3_11(double floor, double m, vector<vector<double>>& romG) {
return ((pow(4, m) * (romG[floor][m - 1])) - romG[floor - 1][m - 1]) / (pow(4, m) - 1);
}
void Romberg(vector<vector<double>>& romG, double eps, double ul, double ll) {
romG[0][0] = (ul - ll) / 2 * (z(ll) + z(ul));
double err = 1; int floor = 1;
while (err > eps) {
romG[floor][0] = formula3_4(floor, ul, ll, romG[floor - 1][0]);
for (int i = 1; i < floor + 1; i++) romG[floor][i] = formula3_11(floor, i, romG);
err = fabs(romG[floor][floor] - romG[floor - 1][floor - 1]);
floor++;
}
for (int i = 0; i < floor; i++) {
for (int j = 0; j < floor; j++) cout << setiosflags(ios::fixed) << setprecision(8) << romG[i][j] << " ";
cout << endl;
}
}
int main() {
double upperl, lowerl, eps; cin >> upperl >> lowerl >> eps; // 上限 下限 阈值
/*upperl = 2 * M_PI;
lowerl = 0;
eps = 10e-10;*/
Romberg(romG, eps, upperl, lowerl);
return 0;
}
12-06
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交