Skip to content

Instantly share code, notes, and snippets.

@Shkarlatov
Created December 28, 2020 17:07
Show Gist options
  • Select an option

  • Save Shkarlatov/5da379b7339d1f6f4c0261ebb6707d98 to your computer and use it in GitHub Desktop.

Select an option

Save Shkarlatov/5da379b7339d1f6f4c0261ebb6707d98 to your computer and use it in GitHub Desktop.
C++ Integral
#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;
}
@Shkarlatov
Copy link
Author

Пример интегрирования по частям разными методами:

  1. Метод трапеции
  2. Метод левых прямоугольников
  3. Метод средних прямоугольников
  4. Метод правых прямоугольников

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment