Run Code
|
API
|
Code Wall
|
Misc
|
Feedback
|
Login
|
Theme
|
Privacy
|
Patreon
Hzzz
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Rextester { public class Program { /// <summary> /// Получает коэффициенты полинома, аппроксимирующего функцию, заданную таблично. /// </summary> /// <param name="t">Массив аргументов функции, заданной таблично.</param> /// <param name="y">Массив значений функции, заданной таблично.</param> /// <param name="n">Максимальная степень полинома.</param> /// <returns>Коэффициенты полинома.</returns> public static double[] Gaousse(double[][] a, double[] b) { int n = b.Length; for (int k = 0; k < n; k++) { if (a[k][k] == 0) // Проверка ведущего элемента (элемент, лежащий на главной диагонали текущей строки) { // Ведущий элемент равен 0,меняем уравнения местами (переставляем строки матрицы) // Ищем не нулевой элемент среди элементов столбца, лежащих ниже double max = 0; int imax = k; for (int i = k + 1; i < n; i++) { if (Math.Abs(a[i][k]) > max) { max = Math.Abs(a[i][k]); imax = i; } } // Меняем уравнения местами double v; for (int j = k; j < n; j++) { v = a[k][j]; a[k][j] = a[imax][j]; a[imax][j] = v; } v = b[k]; b[k] = b[imax]; b[imax] = v; } double akk = a[k][k]; b[k] /= akk; //Делим правую часть на ведущий элемент for (int j = k; j < n; j++) { a[k][j] /= akk; //Делим текущую строку на ведущий элемент } for (int i = k + 1; i < n; i++) { //Перебираем последующие строки, получаем 0 в k-ом столбце if (a[i][k] != 0) { double aik = a[i][k]; b[i] /= aik; b[i] -= b[k]; for (int j = k; j < n; j++) { a[i][j] /= aik; a[i][j] -= a[k][j]; } } } } //Обратный ход метода Гаусса for (int i = n - 2; i >= 0; i--) { for (int j = i + 1; j < n; j++) { b[i] -= a[i][j] * b[j]; } } return b; } static double[] MNK(double[] t, double[] y, int m) { // Количество коэффициентов в полиноме на единицу больше, чем максимальная степень int n = m + 1; // Выделяем память под СЛАУ double[][] A = new double[n][]; for (int i = 0; i < n; i++) { A[i] = new double[n]; } double[] b = new double[n]; // Формируем СЛАУ for (int i = 0; i < n; i++) { double s; for (int j = 0; j < n; j++) { // Вычисляем элемент A[i][j] s = 0; for (int k = 0; k < y.Length; k++) { s += Math.Pow(t[k], i + j); } A[i][j] = s; } // Вычисляем элемент b[i] b[0] = y[0] + y[1] + y[2] + y[3] + y[4]; b[1] = t[0] * y[0] + t[1] * y[1] + t[2] * y[2] + t[3] * y[3] + t[4] * y[4]; } // Решаем СЛАУ double[] c = Gaousse(A, b); return c; } static int p = 1; static int q = 1; public static void Main(string[] args) { // Вывод информации Console.WriteLine("Kulibaba.S.Lab_05"); // Вычисление таблицы функции для первых 5 месяцев double[] t = new double[6]; double[] y = new double[5]; for (int k = 0; k < 5; k++) { // т.к. нумерация месяцев с 1, а элементов массива - с 0, то t[k] = k + 1; } t[5] = 6; for (int k = 1; k <= 5; k++) { y[k - 1] = 10 + 0.05 * (p + 2 * q + 1) * k + 0.01 * (p + q + 1) * k * k + 0.02 * (2 * p + q + 1) * Math.Pow(-1, k); } // Получение линейного тренда double[] linear = MNK(t, y, 1); // Вывод для промежуточного отчета Console.WriteLine(); Console.WriteLine("Коэффициенты линейного тренда"); for (int k = 0; k < 2; k++) { Console.WriteLine(linear[k]); } // Вычисляем значения линейного тренда с использованием найденных коэффициентов double[] trL = new double[6]; for (int k = 0; k < 6; k++) { trL[k] = linear[0] + linear[1] * t[k]; } // Месяцы Console.Write("Месяц (t[k])"); for (int k = 0; k < 6; k++) { Console.Write("{0,10}", t[k]); } Console.WriteLine(); // Объем выпуска Console.Write("Объем выпуска (y[k]), тыс. шт."); for (int k = 0; k < 5; k++) { Console.Write("{0,10:F4}", y[k]); } Console.WriteLine(); // Линейный тренд Console.Write("Линейный тренд"); for (int k = 0; k < 6; k++) { Console.Write("{0,10:F4}", trL[k]); } Console.WriteLine(); Console.ReadKey(); } } }
run
|
edit
|
history
|
help
0
changeMe
JOE'S C# CODE
Testing
Today's work
Jjjj
Operadores
sdfrgthyjuiloiujyhtgrf
test
Generic Interface basic
Calculadora