Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*Реализация алгоритмов нахождения значения определённого интеграла методами:
- -Средних прямоугольников
- -Трапецй
- -Симпсона
- С примером использования*/
- #include <fstream>
- #include <cmath>
- using namespace std;
- typedef double(*pointFunc)(double);
- typedef double(*integrateFunc)(pointFunc, double, double, int);
- double rect (pointFunc f, double a, double b, int n);
- double trap (pointFunc f, double a, double b, int n);
- double simp (pointFunc f, double a, double b, int n);
- struct {
- char name[30];
- integrateFunc f;
- int cuadr;
- } funcs[3] = {
- {"\nМетод прямоуг.", rect, 4},
- {"\nМетод трапеций", trap, 4},
- {"\nМетод симпсона", simp, 16}
- };
- struct task {
- char name[20];
- double a, b;
- pointFunc f;
- double integrate (integrateFunc p, int n) {
- return p (f, a, b, n);
- }
- void print (ostream& out) {
- out << "Функция: y = " << name;
- out << "\nОбласть интегрирования = [" << a << "; " << b << "]\n";
- }
- };
- double f1(double x) {
- return x*x*x*(x-1)+1;
- }
- double f2(double x) {
- return cos(x * x);
- }
- int main() {
- task t_1 = { "x^4 - x^3 + 1",
- -2 , 2, f1 };
- task t_2 = { "cos(x^2)",
- -2.7, -1, f2 };
- ofstream fout("output.txt");
- double val_1[3];
- double analyt = 84./5, err;
- int n = 10;
- fout << "1.\n";
- t_1.print(fout);
- fout << "Аналитическое значение = " << analyt << endl;
- fout << "\nКоличество разбиений отрезка = " << n << endl;
- for (int i = 0; i < 3; ++i) {
- val_1[i] = t_1.integrate(funcs[i].f, n);
- fout << funcs[i].name << ": " << val_1[i];
- err = fabs(analyt - val_1[i]);
- fout << "\nПогрешность:\n" << err << " \t("
- << err / fabs(analyt) * 100 << "%)\n";
- }
- fout << "\n------\n\n2.\n";
- t_2.print(fout);
- n = 10;
- fout << "\nКоличество разбиений отрезка = " << n << endl;
- for (int i = 0; i < 3; ++i) {
- val_1[i] = t_2.integrate(funcs[i].f, n);
- fout << funcs[i].name << ": " << val_1[i];
- }
- n = 20;
- fout << "\n\nКоличество разбиений отрезка = " << n << endl;
- double val_2[3];
- for (int i = 0; i < 3; ++i) {
- val_2[i] = t_2.integrate(funcs[i].f, n);
- fout << funcs[i].name << ": " << val_2[i];
- }
- fout << "\n------\n\nОценка погрешностей по Рунге:\n";
- for (int i = 0; i < 3; ++i) {
- fout << funcs[i].name;
- fout << "\nПогрешность по Рунге: "
- << (val_2[i] - val_1[i]) / (funcs[i].cuadr-1);
- fout << "\nПриближенное значение: "
- << (funcs[i].cuadr*val_2[i] - val_1[i]) / (funcs[i].cuadr-1) << endl;
- }
- fout.close();
- }
- double rect (pointFunc f, double a, double b, int n) {
- if (n == 0) return 0;
- double h = (b - a) / n;
- double x = a + h/2;
- double sum = f(x);
- for (int i = 1; i < n; i++) {
- x+= h;
- sum+= f(x);
- }
- return sum * h;
- }
- double trap (pointFunc f, double a, double b, int n) {
- if (n == 0) return 0;
- double h = (b - a) / n;
- double x = a, sum = 0;
- for (int i = 1; i < n; i++ ) {
- x+= h;
- sum+= f(x);
- }
- sum+= (f(a) + f(b)) / 2;
- return sum * h;
- }
- double simp (pointFunc f, double a, double b, int n) {
- if (n == 0) return 0;
- double h = (b - a) / n;
- double x = a;
- double k1 = 0, k2 = 0, k3 = 0;
- for (int i = 1; i < n; i+= 2) {
- k1+= f(x);
- x+= h;
- k2+= f(x);
- x+= h;
- k3+= f(x);
- }
- return h / 3 * (k1 + 4*k2 + k3);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement