Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.IO;
- namespace ConsoleApp8
- {
- class Progonka
- {
- double[][] A;
- int N;
- double[] Q;
- double[] P;
- double[] d;
- double[] X;
- public Progonka() //считываем и заполняем известные массивы: A и d
- {
- using (StreamReader inp = new StreamReader("input.txt"))
- {
- N = int.Parse(inp.ReadLine());
- A = new double[N][];
- Q = new double[N + 1];
- P = new double[N + 1];
- d = new double[N];
- X = new double[N + 1];
- for (int i = 0; i < N; i++)
- {
- A[i] = new double[N + 2];
- string[] str = inp.ReadLine().Split();
- for (int j = 0; j < N + 2; j++)
- {
- if (j != 0 && j != N + 1)
- A[i][j] = double.Parse(str[j - 1]);
- else
- A[i][j] = 0;
- }
- }
- string[] str2 = inp.ReadLine().Split();
- for (int i = 0; i < N; i++)
- {
- d[i] = double.Parse(str2[i]);
- }
- }
- }
- public Progonka(double[] X, double h, double[] f, int N)
- {
- this.N = N;
- A = new double[N][];
- Q = new double[N + 1];
- P = new double[N + 1];
- d = new double[N];
- this.X = new double[N + 1]; //массив для решения, в данном конструкторе не нужен, просто инициализация обязательна
- for (int i = 0; i < N; ++i)
- {
- A[i] = new double[N + 2];
- for (int j = 0; j < N + 2; ++j)
- A[i][j] = 0;
- }
- for (int i = 0; i < N; i++)
- {
- A[i][i] = 1; //a (побочная диагональ ниже главной)
- A[i][i + 1] = 2 + X[i] * X[i] * h - X[i] * X[i] * X[i] * h * h; //b (главная диагональ)
- A[i][i + 2] = 1 + X[i] * X[i] * h; //c (побочная диагональ выше главной)
- d[i] = f[i] * h * h;
- }
- A[0][0] = 0; A[N - 1][N + 1] = 0; //обнуляем A[0] и C[n]
- }
- //public double F(double x)
- //{
- // 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;
- //}
- public double[] Algoritm()
- {
- CreateP();
- CreateQ();
- CreateX();
- return X;
- }
- private void CreateQ()
- {
- Q[1] = -(d[0] / -A[0][1]); //индекс в программах на 1 меньше, чем в лекциях
- for (int i = 2; i < N + 1; i++)
- {
- 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]);
- }
- }
- private void CreateP()
- {
- P[1] = A[0][2] / -A[0][1]; //индекс в программах на 1 меньше, чем в лекциях
- for (int i = 2; i < N + 1; i++)
- {
- P[i] = (A[i - 1][i + 1]) / (-A[i - 1][i] - A[i - 1][i - 1] * P[i - 1]);
- }
- }
- private void CreateX()
- {
- X[N] = 0;
- for (int i = N - 1; i >= 0; i--)
- {
- X[i] = P[i + 1] * X[i + 1] + Q[i + 1];
- }
- }
- public void Print()
- {
- Console.WriteLine();
- for (int i = 0; i < N; i++)
- {
- for (int j = 0; j < N + 2; j++)
- Console.Write(A[i][j] + " ");
- Console.WriteLine();
- }
- Console.WriteLine();
- }
- }
- class Razn
- {
- int N;
- double h;
- double[] X;
- double[] Y;
- double[] f;
- double[] Yt;
- public Razn()
- {
- N = 25; //Вариант 6, отрезок [0, 6], нужно 25 значений, начиная с 0
- h = 0.25; //Обуславливает начилие 24 аргументов и нуля
- X = new double[N]; //массив аргументов
- Y = new double[N]; //Массив
- f = new double[N];
- Yt = new double[N];
- X[0] = 0;
- Yt[N - 1] = 0;
- for (int i = 1; i < N; i++)
- {
- X[i] = X[i - 1] + h;
- f[i] = Func(X[i]);
- Yt[i] = Ytf(X[i]);
- }
- Y = new Progonka(X, h, f, N).Algoritm(); //тут должен вызываться метод прогонки, принимающий массив аргументов, шаг, f(x) и количество аргументов
- for (int i = 0; i < N; i++)
- {
- Console.WriteLine(i + " X = " + X[i] + " Y = " + Y[i] + " Yточное = " + Yt[i] + " e = " + (Yt[i] - Y[i]));
- }
- }
- private double Ytf(double x)
- {
- return (6 * x * x * x) * (x - 6);
- }
- private double Func(double x)
- {
- 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;
- }
- }
- class Program
- {
- static void Main(string[] args)
- {
- Razn temp = new Razn();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement