Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- namespace IntegratonTable {
- static class Program {
- static double[] x = { 2.7, 3.0, 3.3, 3.7, 4.0, 4.5, 4.9, 5.1 };
- static double[] y = { 0.3, -0.2, -0.7, -1.0, -0.9, -0.5, 0.2, 1.3 };
- static double[] x3 = { -0.707107, 0, 0.707107 };
- static double[] x2 = { -0.577350, 0.577350};
- //4.1
- #region
- //Метод правых квадратов
- public static void RecR() {
- int n = 8;
- double integral = 0.00;
- double step = 0.00;
- for (int i = n - 1; i >= 0; i--) {
- if (i == (n - 1)) {
- step = x[i] - x[i - 1];
- }
- else step = x[i + 1] - x[i];
- integral += step * y[i];
- }
- Console.WriteLine($"Интеграл равен={integral.ToString()}");
- }
- //Метод Левых прямоугольников
- public static void RecL() {
- int n = 8;
- double integral = 0.00;
- double step = 0.00;
- for (int i = 0; i < n; i++) {
- if (i == (n - 1)) {
- step = x[i] - x[i - 1];
- }
- else step = x[i + 1] - x[i];
- integral += step * y[i];
- }
- Console.WriteLine($"Интеграл равен={integral.ToString()}");
- }
- //Метод средних прямоугольников
- static void RecM() {
- int n = 8;
- double integral = 0.00;
- double step = 0.00;
- for (int i = 0; i < n-1; i++) {
- if (i == (n - 1)) {
- step = x[i] - x[i - 1];
- }
- else step = x[i + 1] - x[i];
- integral += step * ((y[i]+y[i+1])/2);
- }
- Console.WriteLine($"Интеграл равен={integral.ToString()}");
- }
- //Метод трапеций
- public static void Trapezium() {
- int n = 8;
- double integral = 0.00;
- double step = 0.00;
- for (int i = 1; i < n; i++) {
- step = x[i] - x[i - 1];
- integral += step * ((y[i-1] + y[i]) / 2);
- }
- Console.WriteLine($"Интеграл равен={integral.ToString()}");
- }
- //Метод Симпсона
- static void simpson() {
- //Выделяем память под ответ
- double integral = 0.0f;
- //Вычисляем сумму площадей в установленных границах
- //x меняется на шаг
- for (int i = 0; i < 7; i++)
- integral += (x[i+1] - x[i]) / 6 * (y[i] + 4 * ((y[i]+y[i+1])/2) + y[i+1]);
- Console.WriteLine($"Интеграл равен: {integral}");
- }
- static void simpson38() {
- //Выделяем память под ответ
- double integral = 0.0f;
- integral = y[0] + y[7];
- for (int i = 1; i<7; i++) {
- //Если элемент третий в триаде, то домножаем на 2
- if (i % 3 == 0)
- integral += 2 * y[i];
- //Если 1-ый или 2-ой в триаде то на 3
- else
- integral += 3 * y[i];
- }
- integral = (0.9 / 8) * integral;
- Console.WriteLine($"Интеграл равен: {integral}");
- }
- static void simpson245() {
- //Выделяем память под ответ
- double integral = 0.0f;
- integral = y[0] + y[7];
- //Костыль для 12 и 14
- Boolean flag = false;
- //ВЫчисляем до последнего слагаемого
- for (int i = 1; i < 7; i++) {
- //Если элемент нечётный, то множитель 32
- if (i % 2 != 0) {
- integral += 32 * y[i];
- }
- //Иначе 12 или 14 по очереди
- else if (!flag) {
- integral += 12 * y[i];
- flag = true;
- }
- else if (flag) {
- integral += 14 * y[i];
- flag = false;
- }
- }
- integral = (0.6 / 45) * integral;
- Console.WriteLine($"Интеграл равен: {integral}");
- }
- #endregion
- //4.2
- #region
- static double t(double x) {
- double min = 2.7, max = 5.1;
- return (max + min) / 2 + (max - min) / 2 * x;
- }
- static double fY(int j, int m) {
- double output = 0;
- if (m == 2)
- output = t(x2[j]);
- else if (m == 3)
- output = t(x3[j]);
- for (int i = 0; i < 7; i++) {
- double eps;
- eps = Math.Abs(x[i] - output);
- if (eps <= 0.19) {
- Console.WriteLine(y[i]);
- return y[i];
- }
- }
- return 0;
- }
- static void Cheb(int m, double min, double max) {
- double integral = 0;
- if (m == 2) {
- for (int j = 0; j < m; j++) {
- integral += fY(j, m);
- }
- }
- else if (m == 3) {
- for (int j = 0; j < m; j++) {
- integral += fY(j, m);
- }
- }
- integral *= (max - min) / m;
- Console.WriteLine(integral);
- }
- static void Gauss(int m, double min, double max) {
- double[] Aj = { 5 / 9f, 8 / 9f, 5 / 9f };
- double integral = 0;
- if (m == 2) {
- for (int j = 0; j < m; j++) {
- integral += fY(j, m);
- }
- }
- else if (m == 3) {
- for (int j = 0; j < m; j++) {
- integral += Aj[j] * fY(j,m);
- }
- }
- integral *= (max - min) / 2;
- Console.WriteLine(integral);
- }
- #endregion
- //4.3
- #region
- static double Tdef1(int i, double step) {
- return (y[i + 1] - y[i - 1]) / 2 * step;
- }
- static double Tdef2(int i, double step) {
- return (y[i + 1] - 2 * y[i] + y[i - 1]) / Math.Pow(step, 2);
- }
- //Метод аппроксимации рядом Тейлора
- static void ART(double min, double max, double n) {
- //Память под результат
- double integral = 0.0f;
- //Вычисляем шаг
- double step = (max - min) / n;
- //"Шагаем" по иксам
- for (int i = 1; i<7; i++) {
- //Считаем по формуле, используя две производные
- integral += y[i] * step + Tdef1(i, step) / 2 * Math.Pow(step,2) + Tdef2(i, step) / 6 * Math.Pow(step, 3);
- }
- Console.WriteLine(integral);
- }
- //Метод Монте-Карло
- static void MonteCarlo(double n) {
- //Создаём генератор псевдослучайных чисел
- Random rnd = new Random();
- //Память под ответ
- double integral = 0.0f;
- int mem = 0;
- //Рандомим n чисел
- for (int i = 0; i < n; i++) {
- //Рандомим число на отрезке [min,max]
- double u = rnd.Next(27, 51);
- u /= 10;
- for (int j = 0; j < 8; j++) {
- if (Math.Abs(x[j] - u) <= 0.15)
- mem = j;
- }
- //Суммируем значение функции в случайной точке
- integral += y[mem];
- }
- integral *= (5.1 - 2.7)/n;
- Console.WriteLine(integral);
- }
- #endregion
- static void Main(string[] args) {
- double min = 2.7, max = 5.1;
- //4.1
- #region
- /*
- Console.WriteLine("Метод средних прямоугольников:");
- RecM();
- Console.WriteLine();
- Console.WriteLine("Метод левых прямоугольников:");
- RecL();
- Console.WriteLine();
- Console.WriteLine("Метод правых прямоугольников:");
- RecR();
- Console.WriteLine();
- Console.WriteLine("Метод трапеций:");
- Trapezium();
- Console.WriteLine();
- Console.WriteLine("Метод Симпсона:");
- simpson();
- Console.WriteLine();
- Console.WriteLine("Правило Симпсона 3/8:");
- simpson38();
- Console.WriteLine();
- Console.WriteLine("Правило Симпсона 2/45:");
- simpson245();
- */
- #endregion
- //4.2
- #region
- Cheb(3, min, max);
- Gauss(3, min, max);
- #endregion
- //4.3
- #region
- MonteCarlo(10000);
- #endregion
- }
- }
- }
Add Comment
Please, Sign In to add comment