Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using namespace std;
- #include <vector>
- #include <cstdio>
- #include <cmath>
- double f(double x) {
- return 1.0 / x;
- }
- double F(double x) {
- return log(x);
- }
- double Integral(double a, double b, int n) {
- double sigma1 = 0, sigma2 = 0;
- double h = (b - a) / n;
- for (int i = 1; i < n; i++) {
- if (i % 2 == 0) sigma2 += f(a + i * h);
- else sigma1 += f(a + i * h);
- }
- return h / 3 * (f(a) + f(b) + 4 * sigma1 + 2 * sigma2);
- }
- int main() {
- double errors[6], a = 1, b = 375, I = F(b) - F(a);
- int M = 29;
- printf("a = %g\nb = %g\n", a, b);
- printf("I = F(b) - F(a) = %g\n", I);
- printf("M = %d\n", a, b, I, M);
- printf("\nSimpson method\n");
- printf("| given error | integration step | integral value | received error |\n");
- double q = 180 / ((b - a) * M);
- int i = 0;
- for (double eps = 1e-2; eps >= 1e-12; eps *= 1e-2) {
- int n = 2 * ceil((b - a) / pow(eps * q, 0.25) / 2.0);
- double integral = Integral(a, b, n);
- double error = fabs(I - integral);
- errors[i++] = error;
- printf("| %.5e | %.10e | %14.14f | %.8e |\n", eps, (b - a) / n, integral, error);
- }
- printf("\nRunge method\n");
- printf("| given error | integration step | received error |\n");
- for (int i = 0; i < 6; i++) {
- double error = errors[i];
- int n = 2 * ceil((b - a) / pow(error, 0.25) / 2.0);
- double h = (b - a) / n;
- double R = 0, In, I2n = Integral(a, b, n);
- do {
- In = I2n;
- I2n = Integral(a, b, n *= 2);
- R = fabs(In - I2n) / 15;
- } while (R > error);
- printf("| %.5e | %.10e | %.8e |\n", error, h, R);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement