Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2018
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.86 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.IO;
  7.  
  8. namespace ConsoleApp8
  9. {
  10.     class Progonka
  11.     {
  12.         double[][] A;
  13.         int N;
  14.         double[] Q;
  15.         double[] P;
  16.         double[] d;
  17.         double[] X;
  18.         public Progonka()   //считываем и заполняем известные массивы: A и d
  19.         {
  20.             using (StreamReader inp = new StreamReader("input.txt"))
  21.             {
  22.                 N = int.Parse(inp.ReadLine());
  23.                 A = new double[N][];
  24.                 Q = new double[N + 1];
  25.                 P = new double[N + 1];
  26.                 d = new double[N];
  27.                 X = new double[N + 1];
  28.                 for (int i = 0; i < N; i++)
  29.                 {
  30.                     A[i] = new double[N + 2];
  31.                     string[] str = inp.ReadLine().Split();
  32.                     for (int j = 0; j < N + 2; j++)
  33.                     {
  34.                         if (j != 0 && j != N + 1)
  35.                             A[i][j] = double.Parse(str[j - 1]);
  36.                         else
  37.                             A[i][j] = 0;
  38.                     }
  39.                 }
  40.                 string[] str2 = inp.ReadLine().Split();
  41.                 for (int i = 0; i < N; i++)
  42.                 {
  43.                     d[i] = double.Parse(str2[i]);
  44.                 }
  45.             }
  46.         }
  47.         public Progonka(double[] X, double h, double[] f, int N)
  48.         {
  49.             this.N = N;
  50.             A = new double[N][];
  51.             Q = new double[N + 1];
  52.             P = new double[N + 1];
  53.             d = new double[N];
  54.             this.X = new double[N + 1]; //массив для решения, в данном конструкторе не нужен, просто инициализация обязательна
  55.             for (int i = 0; i < N; ++i)
  56.             {
  57.                 A[i] = new double[N + 2];
  58.                 for (int j = 0; j < N + 2; ++j)
  59.                     A[i][j] = 0;
  60.             }
  61.             for (int i = 0; i < N; i++)
  62.             {
  63.  
  64.                 A[i][i] = 1;    //a (побочная диагональ ниже главной)
  65.                 A[i][i + 1] = 2 + X[i] * X[i] * h - X[i] * X[i] * X[i] * h * h; //b (главная диагональ)
  66.                 A[i][i + 2] = 1 + X[i] * X[i] * h;  //c (побочная диагональ выше главной)
  67.                 d[i] = f[i] * h * h;
  68.  
  69.             }
  70.             A[0][0] = 0; A[N - 1][N + 1] = 0; //обнуляем A[0] и C[n]
  71.  
  72.         }
  73.         //public double F(double x)
  74.         //{
  75.         //    return 6 * Math.Pow(x, 7) - 36 * Math.Pow(x, 6) + 24 * Math.Pow(x, 5) - 108 * Math.Pow(x, 4) + 72 * Math.Pow(x, 2) - 216 * x;
  76.         //}
  77.         public double[] Algoritm()
  78.         {
  79.             CreateP();
  80.             CreateQ();
  81.             CreateX();
  82.             return X;
  83.         }
  84.         private void CreateQ()
  85.         {
  86.             Q[1] = -(d[0] / -A[0][1]);  //индекс в программах на 1 меньше, чем в лекциях
  87.             for (int i = 2; i < N + 1; i++)
  88.             {
  89.                 Q[i] = (A[i - 1][i - 1] * Q[i - 1] - d[i - 1]) / (-A[i - 1][i] - A[i - 1][i - 1] * P[i - 1]);
  90.             }
  91.         }
  92.         private void CreateP()
  93.         {
  94.             P[1] = A[0][2] / -A[0][1];  //индекс в программах на 1 меньше, чем в лекциях
  95.             for (int i = 2; i < N + 1; i++)
  96.             {
  97.                 P[i] = (A[i - 1][i + 1]) / (-A[i - 1][i] - A[i - 1][i - 1] * P[i - 1]);
  98.             }
  99.         }
  100.         private void CreateX()
  101.         {
  102.             X[N] = 0;
  103.             for (int i = N - 1; i >= 0; i--)
  104.             {
  105.                 X[i] = P[i + 1] * X[i + 1] + Q[i + 1];
  106.             }
  107.         }
  108.         public void Print()
  109.         {
  110.             Console.WriteLine();
  111.             for (int i = 0; i < N; i++)
  112.             {
  113.                 for (int j = 0; j < N + 2; j++)
  114.                     Console.Write(A[i][j] + " ");
  115.                 Console.WriteLine();
  116.             }
  117.             Console.WriteLine();
  118.         }
  119.     }
  120.     class Razn
  121.     {
  122.         int N;
  123.         double h;
  124.         double[] X;
  125.         double[] Y;
  126.         double[] f;
  127.         double[] Yt;
  128.         public Razn()
  129.         {
  130.             N = 25; //Вариант 6, отрезок [0, 6], нужно 25 значений, начиная с 0
  131.             h = 0.25; //Обуславливает начилие 24 аргументов и нуля
  132.             X = new double[N]; //массив аргументов
  133.             Y = new double[N]; //Массив
  134.             f = new double[N];
  135.             Yt = new double[N];
  136.             X[0] = 0;
  137.             Yt[N - 1] = 0;
  138.             for (int i = 1; i < N; i++)
  139.             {
  140.                 X[i] = X[i - 1] + h;
  141.                 f[i] = Func(X[i]);
  142.                 Yt[i] = Ytf(X[i]);
  143.             }
  144.             Y = new Progonka(X, h, f, N).Algoritm(); //тут должен вызываться метод прогонки, принимающий массив аргументов, шаг, f(x) и количество аргументов
  145.             for (int i = 0; i < N; i++)
  146.             {
  147.                 Console.WriteLine(i + "     X = " + X[i] + "         Y = " + Y[i] + "        Yточное = " + Yt[i] + "     e = " + (Yt[i] - Y[i]));
  148.             }
  149.         }
  150.         private double Ytf(double x)
  151.         {
  152.             return (6 * x * x * x) * (x - 6);
  153.         }
  154.  
  155.         private double Func(double x)
  156.         {
  157.             return 6 * Math.Pow(x, 7) - 36 * Math.Pow(x, 6) + 24 * Math.Pow(x, 5) - 108 * Math.Pow(x, 4) + 72 * Math.Pow(x, 2) - 216 * x;
  158.         }
  159.  
  160.     }
  161.  
  162.  
  163.     class Program
  164.     {
  165.         static void Main(string[] args)
  166.         {
  167.             Razn temp = new Razn();
  168.  
  169.         }
  170.     }
  171. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement