Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ConsoleApplication15.cpp: определяет точку входа для консольного приложения.
- //
- #include "stdafx.h"
- #include <iostream>
- #include <math.h>
- using namespace std;
- double Analiticfunc(double x) {
- return pow(x,2);
- }
- double* x(int n, double h, double a) {
- double *x = new double[n];
- for (int i = 0; i <= n; i++)
- x[i] = a + i*h;
- return x;
- }
- double RLeftrest(int n, double a, double b, double *y) {
- double I = 0, k;
- double h = (b - a) / h;
- for (int i = 0; i <= n - 1; i++)
- if (y != NULL) I += y[i];
- else I += Analiticfunc();
- k = I*h;
- return k;
- }
- double Leftrest(int n, double *x, double *y) {
- double I = 0;
- double *h = new double[n];
- for (int i = 0; i <= n; i++)
- h[i] = x[i + 1] - x[i];
- for (int i = 0; i <= n - 1; i++)
- I += y[i] * h[i];
- return I;
- }
- double RRightrest(int n, double *x, double *y) {
- double I = 0;
- double *h = new double[n];
- for (int i = 0; i <= n; i++)
- h[i] = x[i + 1] - x[i];
- for (int i = 1; i <= n; i++)
- I += y[i];
- return I *= h[0];
- }
- double Rightrest(int n, double *x, double *y) {
- double I = 0;
- double *h = new double[n];
- for (int i = 0; i <= n; i++)
- h[i] = x[i + 1] - x[i];
- for (int i = 0; i <= n - 1; i++)
- I += y[i + 1] * h[i];
- return I;
- }
- double RTrapeze(int n, double *x, double *y) {
- double I, z = 0;
- double *h = new double[n];
- for (int i = 0; i <= n; i++)
- h[i] = x[i + 1] - x[i];
- for (int i = 1; i <= n - 1; i++)
- z += y[i];
- I = h[0] * (y[0] + 2 * z + y[n]) / 2;
- return I;
- }
- double Trapeze(int n, double *x, double *y) {
- double I, z = 0;
- double *h = new double[n];
- for (int i = 0; i <= n; i++)
- h[i] = x[i + 1] - x[i];
- for (int i = 1; i <= n - 1; i++)
- z += y[i] * (h[i - 1] + h[i]);
- I = (y[0] * h[0] + z + y[n] * h[n - 1]) / 2;
- return I;
- }
- double RSimpsone(int n, double *x, double *y) {
- double I;
- double m = (double)(n / 2);
- double *h = new double[n];
- for (int i = 0; i <= n; i++)
- h[i] = x[i + 1] - x[i];
- double z = 0, s = 0;
- for (int i = 0; i <= m - 1; i++)
- z += y[2 * i + 1];
- for (int i = 1; i <= m - 1; i++)
- s += y[2 * i];
- I = (2 * h[0] / 6)*(y[0] + 4 * z + 2 * s + y[2 * (int)m]);
- return I;
- }
- double Simpsone(int n, double *x, double *y) {
- double I = 0;
- int m = n / 2 - 1;
- double *h = new double[n];
- for (int i = 0; i <= n; i++)
- h[i] = x[i + 1] - x[i];
- for (int i = 0; i <= m; i++)
- I += ((h[2 * i + 1] + h[2 * i]) / (6 * h[2 * i + 1] * h[2 * i]))*(h[2 * i + 1] * (2 * h[2 * i] - h[2 * i + 1])*y[2 * i] + pow(h[2 * i + 1] + h[2 * i], 2)*y[2 * i + 1] + h[2 * i] * (2 * h[2 * i + 1] - h[2 * i])*y[2 * i + 2]);
- return I;
- }
- void Rav(int n, int numb) {
- double a, b, h;
- int s;
- cout << "Введите границы отрезка: ";
- cin >> a >> b;
- h = (double)((b - a) / n);
- double *x = new double[n];
- for (int i = 0; i <= n; i++)
- x[i] = a + i*h;
- cout << endl << "Способ задания функции:" << endl << " 1 - табличная" << endl << " 2 - аналитическая ";
- cin >> s;
- switch (s) {
- case 1: {
- double *y = new double[n];
- cout << "Введите значения функции в узлах сетки: ";
- for (int i = 0; i <= n; i++) {
- cout << "y[" << i << "] ";
- cin >> y[i];
- }
- cout << endl << "Значение интеграла: ";
- switch (numb) {
- case 1: cout << RLeftrest(n, x, y);
- break;
- case 2: cout << RRightrest(n, x, y);
- break;
- case 3: cout << RTrapeze(n, x, y);
- break;
- case 4: cout << RSimpsone(n, x, y);
- break;
- }
- } break;
- case 2: {
- cout << endl << "Значение интеграла: ";
- switch (numb) {
- case 1: cout << RLeftrest(n, x, NULL);
- break;
- case 2: cout << RRightrest(n, x, NULL);
- break;
- case 3: cout << RTrapeze(n, x, NULL);
- break;
- case 4: cout << RSimpsone(n, x, NULL);
- break;
- }
- } break;
- }
- }
- void neRav(int n, int numb) {
- double *x = new double[n];
- cout << "Введите узлы сетки: ";
- for (int i = 0; i <= n; i++) {
- cout << "x[" << i << "] ";
- cin >> x[i];
- }
- int s;
- cout << endl << "Способ задания функции:" << endl << " 1 - табличная" << endl << " 2 - аналитическая ";
- cin >> s;
- switch (s) {
- case 1: {
- double *y = new double[n];
- cout << "Введите значения функции в узлах сетки: ";
- for (int i = 0; i <= n; i++) {
- cout << "y[" << i << "] ";
- cin >> y[i];
- }
- cout << endl << "Значение интеграла: ";
- switch (numb) {
- case 1: cout << Leftrest(n, x, y);
- break;
- case 2: cout << Rightrest(n, x, y);
- break;
- case 3: cout << Trapeze(n, x, y);
- break;
- case 4: cout << Simpsone(n, x, y);
- break;
- }
- } break;
- case 2: {
- cout << endl << "Значение интеграла: ";
- switch (numb) {
- case 1: cout << Leftrest(n, x, Analiticfunc(n, x));
- break;
- case 2: cout << Rightrest(n, x, Analiticfunc(n, x));
- break;
- case 3: cout << Trapeze(n, x, Analiticfunc(n, x));
- break;
- case 4: cout << Simpsone(n, x, Analiticfunc(n, x));
- break;
- }
- } break;
- }
- }
- void Dinamic(int n, int numb) {
- int k = 1, q = 2, n1;
- double e, I, I1, d;
- double a, b, h, h1;
- n1 = q*n;
- cout << "Введите границы отрезка: ";
- cin >> a >> b;
- h = (double)((b - a) / n);
- h1 = (double)((b - a) / n1);
- cout << endl << "Введите точность вычисления интеграла: ";
- cin >> e;
- switch (numb) {
- case 1: {
- I = RLeftrest(n, x(n, h, a), Analiticfunc(n, x(n, h, a)));
- I1 = RLeftrest(n1, x(n1, h1, a), Analiticfunc(n1, x(n1, h1, a)));
- } break;
- case 2: {
- I = RRightrest(n, x(n, h, a), Analiticfunc(n, x(n, h, a)));
- I1 = RRightrest(n1, x(n1, h1, a), Analiticfunc(n1, x(n1, h1, a)));
- } break;
- case 3: {
- I = RTrapeze(n, x(n, h, a), Analiticfunc(n, x(n, h, a)));
- I1 = RTrapeze(n1, x(n1, h1, a), Analiticfunc(n1, x(n1, h1, a)));
- } break;
- case 4: {
- I = RSimpsone(n, x(n, h, a), Analiticfunc(n, x(n, h, a)));
- I1 = RSimpsone(n1, x(n1, h1, a), Analiticfunc(n1, x(n1, h1, a)));
- } break;
- default: break;
- }
- for (; abs((I1 - I) / I1) > e;) {
- n = n1;
- n1 = n*q;
- h = (double)((b - a) / n);
- h1 = (double)((b - a) / n1);
- if (numb == 1) {
- I = RLeftrest(n, x(n, h, a), Analiticfunc(n, x(n, h, a)));
- I1 = RLeftrest(n1, x(n1, h1, a), Analiticfunc(n1, x(n1, h1, a)));
- }
- if (numb == 2) {
- I = RRightrest(n, x(n, h, a), Analiticfunc(n, x(n, h, a)));
- I1 = RRightrest(n1, x(n1, h1, a), Analiticfunc(n1, x(n1, h1, a)));
- }
- if (numb == 3) {
- I = RTrapeze(n, x(n, h, a), Analiticfunc(n, x(n, h, a)));
- I1 = RTrapeze(n1, x(n1, h1, a), Analiticfunc(n1, x(n1, h1, a)));
- }
- if (numb == 4) {
- I = RSimpsone(n, x(n, h, a), Analiticfunc(n, x(n, h, a)));
- I1 = RSimpsone(n1, x(n1, h1, a), Analiticfunc(n1, x(n1, h1, a)));
- }
- k++;
- }
- d = abs((I1 - I) / I1);
- cout << "Значение интеграла: " << I1 << endl;
- cout << "Количество итераций: " << k << endl;
- cout << "Достигнутая точность: " << d << endl;
- }
- int main()
- {
- setlocale(LC_ALL, "ru");
- int numb;
- cout << "Выберите формулу интегрирования:" << endl << " 1 - левосторонний прямоугольник" << endl << " 2 - правосторонний прямоугольник" << endl << " 3 - трапеция" << endl << " 4 - формула Симпсона ";
- cin >> numb;
- int m, n;
- cout << "Количество интервалов интегрирования (для формулы Симпсона n должна быть кратна 2): ";
- cin >> n;
- cout << "Выберите тип сетки:" << endl << " 1 - равномерная" << endl << " 2 - неравномерная" << endl << " 3 - динамическая ";
- cin >> m;
- switch (m) {
- case 1: Rav(n, numb);
- break;
- case 2: neRav(n, numb);
- break;
- case 3: Dinamic(n, numb);
- break;
- }
- cout << endl;
- system("pause");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement