Advertisement
Xsufu

Тейлор и Монте-Карло C#

Dec 8th, 2020 (edited)
1,367
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.21 KB | None | 0 0
  1. /* ЗДАРОВА, ГОРЕ ПРОГЕРЫ ИЗ ВОДНИКА РАБОТАЕТ ЭТО ВСЁ АБЫ КАК, НО ЖИЛА ПРИНИМАЕТ. ВСЕ ОШИБКИ СКИДЫВАЕМ НА ПОГРЕШНОСТЬ И ГГ*/
  2.  
  3.  
  4. using System;
  5.  
  6. namespace Integration3 {
  7.     class Program {
  8.  
  9.         //"а"
  10.         #region
  11.         //Изначальная ф-ия
  12.         static float Af(float x) {
  13.             return 1 / MathF.Pow(MathF.Cosh(x), 2);
  14.         }
  15.  
  16.         //Первая производная
  17.         static float Adef1(float x) {
  18.             return -2 * MathF.Sinh(x) / MathF.Pow(MathF.Cosh(x), 3);
  19.         }
  20.  
  21.         //Вторая производная
  22.         static float Adef2(float x) {
  23.             float chisl = 6 * MathF.Pow(MathF.Sinh(x), 2) - 2 * MathF.Pow(MathF.Cosh(x), 2);
  24.             float znam = MathF.Pow(MathF.Cosh(x), 4);
  25.             return chisl / znam;
  26.         }
  27.         #endregion
  28.  
  29.         //"б"
  30.         #region
  31.         //Изначальная ф-ия "б"
  32.         static float Bf(float x) {
  33.             return (float)Math.Sqrt(x + 1);
  34.         }
  35.  
  36.         //Первая и вторая производные ф-ии "б"
  37.        
  38.         static float Bdef1(float x) {
  39.             float srt = MathF.Sqrt(x + 1);
  40.             return 1/(2*srt);
  41.         }
  42.  
  43.         static float Bdef2(float x) {
  44.             float znam = 4 * MathF.Sqrt(x + 1) * (x + 1);
  45.             return - 1 / znam;
  46.         }
  47.         #endregion
  48.  
  49.         //Метод аппроксимации рядом Тейлора
  50.         static float ART(float min, float max, float n, int menu) {
  51.             //Память под результат
  52.             float integral = 0.0f;
  53.             //Вычисляем шаг
  54.             float step = (max - min) / n;
  55.             if (menu == 1) {
  56.                 //"Шагаем" по иксам
  57.                 for (float x = min; x < max - step; x += step) {
  58.                     //Считаем по формуле, используя две производные
  59.                     integral += Af(x) * step + Adef1(x) / 2 * MathF.Pow(step, 2) + Adef2(x) / 6 * MathF.Pow(step, 3);
  60.                 }
  61.                 Console.WriteLine($"Интеграл равен: {integral}");
  62.             }
  63.  
  64.             else if (menu == 2) {
  65.                 //"Шагаем" по иксам
  66.                 for (float x = min; x < max - step; x += step) {
  67.                     //Считаем по формуле, используя две производные
  68.                     integral += Bf(x) * step + Bdef1(x) / 2 * MathF.Pow(step, 2) + Bdef2(x) / 6 * MathF.Pow(step, 3);
  69.                 }
  70.                 return integral;
  71.             }
  72.  
  73.             return 0;
  74.         }
  75.  
  76.         //Метод Монте-Карло
  77.         static float MonteCarlo(float n, int menu) {
  78.             //Создаём генератор псевдослучайных чисел
  79.             Random rnd = new Random();
  80.             //Память под ответ
  81.             float integral = 0.0f;
  82.             //Память под пределы интегрирования
  83.             float min = 0, max = 0;
  84.  
  85.             //Функция "а"
  86.             if (menu == 1) {
  87.                 min = MathF.Log(2); max = MathF.Log(3);
  88.                 //Рандомим n чисел
  89.                 for (int i = 0; i < n; i++) {
  90.                     //Рандомим число на отрезке [min,max]
  91.                     float u = rnd.Next(693, 1098);
  92.                     u = u / 1000;
  93.                     //Суммируем значение функции в случайной точке
  94.                     integral += Af(u);
  95.                 }
  96.  
  97.                 //Вычисляем значение интеграла,
  98.                 //Домножив сумму на b-a/n
  99.                 integral *= (max - min) / n;
  100.                 Console.WriteLine(integral);
  101.             }
  102.  
  103.             //Функция "б"
  104.             else if (menu == 2) {
  105.                 min = 1; max = 3;
  106.                 //Рандомим n числел
  107.                 for (int i = 0; i < n; i++) {
  108.                     //Рандомим число на отрезке [min, max]
  109.                     float u = rnd.Next(1, 4);
  110.                     //Суммируем значение функции в случайной точке
  111.                     integral += Bf(u);
  112.                 }
  113.  
  114.                 //Вычисляем значение интеграла,
  115.                 //Домножив сумму на b-a/n
  116.                 return integral *= (max - min) / n;
  117.             }
  118.  
  119.             return 0;
  120.         }
  121.  
  122.         static void Main(string[] args) {
  123.             int menu = 0;
  124.             Console.WriteLine("Выберите функцию:");
  125.             Console.WriteLine("\t1)1/cosh(x)^2\n\t2)sqrt(x+1)");
  126.             menu = Int32.Parse(Console.ReadLine());
  127.             float min = 0, max = 0;
  128.             switch (menu) {
  129.                 case 1:
  130.                     min = MathF.Log(2);
  131.                     max = MathF.Log(3);
  132.                     break;
  133.                 case 2:
  134.                     min = 1;
  135.                     max = 3;
  136.                     break;
  137.                 default:
  138.                     Console.WriteLine("Ошибка");
  139.                     break;
  140.             }
  141.  
  142.             //Для задания "а" считаем разным разбиением
  143.             if (menu == 1) {
  144.                 Console.WriteLine("Аппроксимация методом Тейлора");
  145.                 ART(min, max, 5, menu);
  146.                 ART(min, max, 10, menu);
  147.                 ART(min, max, 100, menu);
  148.  
  149.                 Console.WriteLine("Метод Монте-Карло");
  150.                 MonteCarlo(5, menu);
  151.                 MonteCarlo(10, menu);
  152.                 MonteCarlo(100, menu);
  153.             }
  154.            
  155.             else if (menu == 2) {
  156.                 //Ответ полученный по формуле Нютона-Лейбница
  157.                 float answer = 3.448f;
  158.                 //Желаемая точность вычислений
  159.                 float eps = 0.1f;
  160.                 //Память под результат вычислений
  161.                 float integral = 0;
  162.                 //Количество разбиений промоежутка интегрирования
  163.                 float i = 0;
  164.                 Console.WriteLine("Аппроксимация методом Тейлора");
  165.                 while(MathF.Abs(answer-integral) > eps) {
  166.                     i++;
  167.                     integral = ART(min, max, i, menu);
  168.                    
  169.                 }
  170.                 Console.WriteLine($"Интеграл равен: {integral}. Количество итераций: {i}");
  171.  
  172.                 i = 0; integral = 0;
  173.  
  174.                 Console.WriteLine("Метод Монте-Карло");
  175.                 while (MathF.Abs(answer - integral) > eps) {
  176.                     i++;
  177.                     integral = MonteCarlo(i, menu);
  178.                 }
  179.                 Console.WriteLine($"Интеграл равен: {integral}. Количество итераций: {i}");
  180.             }
  181.         }
  182.     }
  183. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement