Created
December 28, 2020 17:07
-
-
Save Shkarlatov/5da379b7339d1f6f4c0261ebb6707d98 to your computer and use it in GitHub Desktop.
C++ Integral
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include <iostream> | |
| #include <vector> | |
| #include <fstream> | |
| #include <cmath> | |
| #include <clocale> | |
| using namespace std; | |
| double solve_rect_l(double (*func)(double g), double x, double h) | |
| { | |
| return func(x); | |
| } | |
| double solve_rect_mid(double (*func)(double g), double x, double h) | |
| { | |
| return func(x + h / 2); | |
| } | |
| double solve_rect_r(double (*func)(double g), double x, double h) | |
| { | |
| return func(x + h); | |
| } | |
| double solve_trapezia(double (*func)(double x), double x, double h) | |
| { | |
| double a = func(x); | |
| double b = func(x + h); | |
| return (a + b) / 2; | |
| } | |
| //основная ф-уция | |
| // *func указатель на интегрируемую ф-цию | |
| // *method указатель на метод интегр. | |
| double integrate(double (*func)(double g), double a, double b, int step_size, double (*method)(double (*func)(double g), double x, double h)) | |
| { | |
| double sum = 0; | |
| double h = (b - a) / step_size; | |
| for (int i = 0; i < step_size; ++i) | |
| { | |
| sum = sum + method(func, a + h * i, h); | |
| } | |
| return h * sum; | |
| } | |
| double sample_f1(double x) | |
| { | |
| return x * x; | |
| } | |
| double sample_f2(double x) | |
| { | |
| return (x * x * x) / 2; | |
| } | |
| double sample_f3(double x) | |
| { | |
| return x * 3 + 17; | |
| } | |
| double sample_f4(double x) | |
| { | |
| return sin(x); | |
| } | |
| double sample_f5(double x) | |
| { | |
| return 16 * x * x - 4 * x + 4; | |
| } | |
| // | |
| int main() | |
| { | |
| start: | |
| cout << "Выберите метод:" << endl; | |
| cout << "1. Метод трапеции" << endl; | |
| cout << "2. Метод левых прямоугольников " << endl; | |
| cout << "3. Метод средних прямоугольников " << endl; | |
| cout << "4. Метод правых прямоугольников " << endl; | |
| int method; | |
| cin >> method; | |
| double (*methodPtr)(double (*func)(double x), double x, double h); | |
| switch (method) | |
| { | |
| case 1: | |
| methodPtr = solve_trapezia; | |
| break; | |
| case 2: | |
| methodPtr = solve_rect_l; | |
| break; | |
| case 3: | |
| methodPtr = solve_rect_mid; | |
| break; | |
| case 4: | |
| methodPtr = solve_rect_r; | |
| break; | |
| default: | |
| cout << "Ошибка. Вне диапазона." << endl; | |
| return -1; | |
| } | |
| cout << "Выберите функцию:" << endl; | |
| cout << "1. x^2" << endl; | |
| cout << "2. (x^3)/2" << endl; | |
| cout << "3. 3x+17" << endl; | |
| cout << "4. sin(x)" << endl; | |
| cout << "5. 16x^2 -4x +4" << endl; | |
| //добавить пример | |
| int sample; | |
| cin >> sample; | |
| double (*samplePtr)(double x); | |
| switch (sample) | |
| { | |
| case 1: | |
| samplePtr = sample_f1; | |
| break; | |
| case 2: | |
| samplePtr = sample_f2; | |
| break; | |
| case 3: | |
| samplePtr = sample_f3; | |
| break; | |
| case 4: | |
| samplePtr = sample_f4; | |
| break; | |
| case 5: | |
| samplePtr = sample_f5; | |
| break; | |
| //добавить пример | |
| default: | |
| cout << "Ошибка. Вне диапазона." << endl; | |
| return -1; | |
| } | |
| cout << "Введите параметры: A= B= и шаг H=" << endl; | |
| double a, b, h; | |
| cin >> a >> b >> h; | |
| double result = integrate(samplePtr, a, b, h, methodPtr); | |
| cout << "Результат: " << result << endl; | |
| ofstream outFile; | |
| outFile.open("result.txt"); | |
| outFile << "A=" << a << " B=" << b << " H=" << h << " Result=" << result; | |
| outFile.flush(); | |
| outFile.close(); | |
| goto start; | |
| } |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Пример интегрирования по частям разными методами: