/// <summary> /// Полиномы Эрмита для набора кратных узлов /// </summary> /// <param name="mas"></param> /// <returns></returns> public static Polynom Hermit(params MultipleKnot[] mas) { int n = -1;//dergee of Pol for (int i = 0; i < mas.Length; i++) { n += mas[i].Multiplicity; } SLAU S = new SLAU(n + 1);//S.Show(); int k = 0; for (int i = 0; i < mas.Length; i++) { for (int j = 0; j < mas[i].Multiplicity; j++) { S.b[k + j] = mas[i].y[j]; for (int t = 0; t <= n - j; t++) { int s = n - j - t; S.A[k + j, t] = Combinatorik.A(s, j + s) * Math.Pow(mas[i].x, s); } } k += mas[i].Multiplicity; } S.GaussSelection(); //S.Show(); Array.Reverse(S.x); return(new Polynom(S.x)); }
private void label2_Click(object sender, EventArgs e) { SLAU Matr = new SLAU(Matrix, E); //тут создаем объект класса СЛАУ где будет считаться система и передаем туда нашу матрицу и точность float[] x = Matr.MethZeygAndIter('i'); // вызываем функцию которая будет считать методом итераций и передаем флаг i чтобы обозначить метод итераций for (int i = 0; i < x.Length; i++) // это цикл вывода полученных ответов на форму 2 { label3.Text = (x[0].ToString()); // в каждйы лэйбл засовываем наш ответ label4.Text = (x[1].ToString()); label5.Text = (x[2].ToString()); } }
/// <summary> /// Точка пересечения двух прямых либо null, когда прямые не пересекаются или совпадают /// </summary> /// <param name="a"></param> /// <param name="b"></param> /// <returns></returns> public static Point?InterSecPoint(Line2D a, Line2D b) { if (IsParallel(a, b)) { return(null); } SLAU s = new SLAU(new Matrix(new double[, ] { { a.A, a.B, -a.C }, { b.A, b.B, -b.C } })); s.GaussSelection(); return(new Point(s.x[0], s.x[1])); }
/// <summary> /// Интерполяция рациональной функцией по точкам /// </summary> /// <param name="P">Массив точек</param> /// <param name="p">Степень полинома в числителе</param> /// <param name="q">Степень полинома в знаменателе</param> /// <param name="bq">Старший коэффициент в знаменателе</param> /// <returns></returns> public static Func <double, double> R(Point[] P, int p, int q, double bq = 1) { if (p + q + 1 != P.Length) { throw new Exception("Не выполняется равенство p+q+1=n !"); } if (bq == 0) { throw new Exception("Старший коэффициент полинома не может быть нулевым!"); } Matrix M = new Matrix(P.Length, P.Length + 1); for (int i = 0; i < M.n; i++) { M[i, P.Length] = P[i].y * bq * Math.Pow(P[i].x, q); for (int j = 0; j <= p; j++) { M[i, j] = Math.Pow(P[i].x, j); } for (int j = p + 1; j < M.m - 1; j++) { M[i, j] = -P[i].y * Math.Pow(P[i].x, j - p - 1); } } SLAU S = new SLAU(M); //S.Show(); S.Gauss(); syst = S; //S.Show(); Vectors numerator = new Vectors(p + 1); Vectors denominator = new Vectors(q + 1); for (int i = 0; i <= p; i++) { numerator[i] = S.x[i]; } for (int i = 0; i < q; i++) { denominator[i] = S.x[p + 1 + i]; } denominator[q] = bq; Polynom num = new Polynom(numerator); Polynom den = new Polynom(denominator); //num.Show();den.Show(); Rat = String.Format("({0}) / ({1})", num.ToString(), den.ToString()); return((double x) => { return num.Value(x) / den.Value(x); }); }
private static void SHOWS(SLAU S) { int size = S.Size; for (int i = 0; i < size; i++) { string s = ""; s += "||"; for (int j = 0; j < size - 1; j++) { s += String.Format("{0} \t", S.A[i, j]); } s += String.Format("{0}\t|| \t||{1}|| \t{2}", S.A[i, size - 1], S.x[i], S.b[i]); Program.data.textBox1.Items.Add(s); } }
static void Main(string[] args) { try { Console.WriteLine("Метод Гаусса"); SLAU slau = new SLAU(); slau.Print(); slau.GaussMethod(); Console.WriteLine("Метод Прогона"); SLAU slauRun = new SLAU(0.0f); slauRun.RunThroughMethod(); } catch (Exception e) { Console.WriteLine(e.Message); } }
/// <summary> /// Решение уравнения теплопроводности явной либо неявной схемой /// </summary> /// <param name="f">Свободная фунция из уравнения</param> /// <param name="f1">Функция из первого краевого условия</param> /// <param name="f2">Функция из второго краевого условия</param> /// <param name="u0">Функция из начальных условий</param> /// <param name="u">Искомая функция (нужна для вычисления точности самого решения)</param> /// <param name="a">Коэффициент при второй производной</param> /// <param name="A1"></param> /// <param name="B1"></param> /// <param name="A2"></param> /// <param name="B2"></param> /// <param name="x0">Начало отрезка по пространству</param> /// <param name="X">Конец отрезка по пространству</param> /// <param name="t0">Начало отрезка по времени</param> /// <param name="T">Конец отрезка по времени</param> /// <param name="xcount">Число шагов по пространству</param> /// <param name="tcount">Число шагов по времени</param> /// <param name="accuracy">Выводимая точность</param> /// <param name="explict">Использовать явную схему либо нет</param> /// <returns></returns> public static List <NetFunc> TU(DRealFunc f, Func <double, double> f1, Func <double, double> f2, Func <double, double> u0, DRealFunc u, double a, double A1, double B1, double A2, double B2, double x0, double X, double t0, double T, int xcount, int tcount, out double accuracy, bool explict = true, bool thirdkind = true) { List <NetFunc> res = new List <NetFunc>(); double h = (X - x0) / (xcount - 1); double tau = (T - t0) / (tcount - 1); double[] x = new double[xcount], t = new double[tcount]; double[] value = new double[xcount]; for (int i = 0; i < xcount; i++) { x[i] = x0 + i * h; } for (int i = 0; i < tcount; i++) { t[i] = t0 + i * tau; } for (int i = 0; i < xcount; i++) { value[i] = u0(x[i]); } res.Add(new NetFunc(x, value)); double th = tau / h / h; double h1 = A1 + h * B1, h2 = A2 + h * B2; //(h1*h1.Reverse()).Show(); if (explict) { for (int i = 1; i < tcount; i++) { for (int j = 1; j < xcount - 1; j++) { value[j] = res[i - 1].Values[j] + a * th * (res[i - 1].Values[j - 1] - 2 * res[i - 1].Values[j] + res[i - 1].Values[j + 1]) + tau * f(t[i /*-1*/], x[j]); } if (thirdkind) { value[0] = (A1 * value[1] + h * f1(t[i])) / h1; value[xcount - 1] = (A2 * value[xcount - 2] + h * f2(t[i])) / h2; } else { value[0] = f1(t[i]) / B1; value[xcount - 1] = f2(t[i]) / B2; } res.Add(new NetFunc(x, value)); //new Vectors (res.Last().Values).Show(); } } else { SLAU s = new SLAU(xcount); for (int i = 1; i < tcount; i++) { if (thirdkind) { s.A[0, 0] = h1; s.A[0, 1] = -A1; s.b[0] = h * f1(t[i]); s.A[xcount - 1, xcount - 1] = h2; s.A[xcount - 1, xcount - 2] = -A2; s.b[xcount - 1] = h * f2(t[i]); } else { s.A[0, 0] = B1; s.b[0] = f1(t[i]); s.A[xcount - 1, xcount - 1] = B2; s.b[xcount - 1] = f2(t[i]); } for (int j = 1; j < xcount - 1; j++) { s.A[j, j - 2 + 1] = -a * th; s.A[j, j - 2 + 2] = a * 2 * th + 1; s.A[j, j - 2 + 3] = -a * th; s.b[j] = res[i - 1].Values[j - 2 + 2] + tau * f(t[i /*-1*/], x[j]); } s.ProRace(); // "".Show(); //s.Show(); value = s.x; res.Add(new NetFunc(x, value)); } } accuracy = 0; double[,] ac = new double[tcount, xcount]; for (int i = 0; i < t.Length; i++) { for (int j = 0; j < x.Length; j++) { ac[i, j] = Math.Abs(u(t[i], x[j]) - res[i].Values[j]); } } accuracy = new Matrix(ac).Max; return(res); }
/// <summary> /// Решение задачи Штурма-Лиувилля /// </summary> /// <param name="g">Функция внутри второй производной</param> /// <param name="h">Функция при первой производной</param> /// <param name="s">Функция при искомой функции</param> /// <param name="f">Свободная функция</param> /// <param name="a">Начало отрезка</param> /// <param name="b">Конец отрезка</param> /// <param name="N">Число шагов</param> /// <param name="A"></param> /// <param name="B"></param> /// <param name="C"></param> /// <param name="D"></param> /// <param name="A1"></param> /// <param name="B1"></param> /// <param name="C1"></param> /// <param name="D1"></param> /// <returns></returns> public static NetFunc SchLiuQu(Func <double, double> g, Func <double, double> h, Func <double, double> s, Func <double, double> f, out double nevaska, double a = 0, double b = 10, int N = 50, double A = 1, double B = 1, double D = 1, double A1 = 1, double B1 = 1, double D1 = 1, bool firstkind = true) { double[] hn = new double[N + 1], fn = new double[N + 1], sn = new double[N + 1], tn = new double[N + 1], an = new double[N + 1], bn = new double[N + 1], cn = new double[N + 1], dn = new double[N + 1]; double t = (b - a) / N; for (int i = 0; i < N + 1; i++) { double arg = a + i * t; tn[i] = arg; hn[i] = h(arg); fn[i] = f(arg); sn[i] = s(arg); an[i] = (g(arg - t / 2) / t - hn[i] / 2) / t; cn[i] = (g(arg + t / 2) / t + hn[i] / 2) / t; bn[i] = an[i] + cn[i] - sn[i]; //поставил sn вместо hn //bn[i] = (g(arg + t / 2) - g(arg - t / 2)) / t / t - sn[i]; dn[i] = fn[i]; } double k1 = 0, k2 = 0; if (firstkind) { bn[0] = A / t - B; cn[0] = A / t; dn[0] = D; an[N] = -A1 / t; bn[N] = -A1 / t - B1; dn[N] = D1; } else { bn[0] = 3 * A / 2 / t - B; cn[0] = 2 * A / t; k1 = -A / 2 / t; bn[N] = -3 * A1 / 2 / t - B1; an[N] = -2 * A1 / t; k2 = A1 / 2 / t; } dn[0] = D; dn[N] = D1; SLAU S = new SLAU(N + 1); S.A[0, 0] = -bn[0]; S.A[0, 1] = cn[0]; S.A[0, 2] = k1; S.A[N, N - 1] = an[N]; S.A[N, N - 2] = k2; S.A[N, N] = -bn[N]; S.b[0] = dn[0]; S.b[N] = dn[N]; for (int i = 1; i < N; i++) { S.A[i, 0 + i - 1] = an[i]; S.A[i, 1 + i - 1] = -bn[i]; S.A[i, 2 + i - 1] = cn[i]; S.b[i] = dn[i]; } S.Show(); "".Show(); double c1 = S.A[0, 2] / S.A[1, 2], c2 = S.A[N, N - 2] / S.A[N - 1, N - 2]; for (int i = 0; i < 3; i++) { S.A[0, i] -= S.A[1, i] * c1; S.A[N, N - i] -= S.A[N - 1, N - i] * c2; } S.b[0] -= S.b[1] * c1; S.b[N] -= S.b[N - 1] * c2; //S.Show(); "".Show(); S.ProRace(); S.Show(); nevaska = S.Nevaska; NetFunc res = new NetFunc(); for (int i = 0; i < N + 1; i++) { res.Add(new Point(tn[i], S.x[i])); } return(res); }
/// <summary> /// Интерполяция кубическими сплайнами дефекта 1 по массиву точек /// </summary> /// <param name="P"></param> /// <param name="a">Граничное условие в начале отрезка</param> /// <param name="b">Граничное условие в конце отрезка</param> /// <param name="is0outcut">Должен ли сплайн равняться 0 вне отрезка задания</param> /// <returns></returns> public static Func <double, double> CubeSpline(Point[] P, double a = 0, double b = 0, bool is0outcut = false) { int n = P.Length - 1;//записать в новую переменную для облегчения double[] h = new double[n + 1]; double[] y = new double[n + 1]; hmax = P[1].x - P[0].x; for (int i = 1; i <= n; i++) { h[i] = P[i].x - P[i - 1].x;//Заполнение массива длин отрезков if (h[i] > hmax) { hmax = h[i]; } y[i] = P[i].y - P[i - 1].y; } //создание, заполнение и решение системы с трёхдиагональной матрицей SLAU S = new SLAU(n + 1); S.A[0, 0] = -4.0 / h[1]; S.A[0, 1] = -2.0 / h[1]; S.b[0] = -6.0 * y[1] / (h[1] * h[1]) + a; S.A[n, n - 1] = 2.0 / h[n]; S.A[n, n] = 4.0 / h[n]; S.b[n] = 6.0 * y[n] / (h[n] * h[n]) + b; for (int i = 1; i <= n - 1; i++) { S.A[i, i - 1] = 1.0 / h[i]; S.A[i, i] = 2 * (1.0 / h[i] + 1.0 / h[i + 1]); S.A[i, i + 1] = 1.0 / h[i + 1]; S.b[i] = 3 * (y[i] / h[i] / h[i] + y[i + 1] / h[i + 1] / h[i + 1]); } //S.b[0] = a; //S.b[n] = b; S.ProRace(); syst = S; //S.Show(); //создание и заполнение массива полиномов Polynom[] mas = new Polynom[n + 1]; Polynom.SplinePol = new string[n]; for (int i = 1; i <= n; i++) { Polynom p1, p2, p3, p4; p1 = (new Polynom(1, P[i].x, P[i].x)) * (2 * new Polynom(P[i - 1].x) + h[i]) / Math.Pow(h[i], 3) * P[i - 1].y; p2 = (new Polynom(1, P[i - 1].x, P[i - 1].x)) * (-2 * new Polynom(P[i].x) + h[i]) / Math.Pow(h[i], 3) * P[i].y; p3 = (new Polynom(1, P[i].x, P[i].x)) * (new Polynom(P[i - 1].x)) / Math.Pow(h[i], 2) * S.x[i - 1]; p4 = (new Polynom(1, P[i - 1].x, P[i - 1].x)) * (new Polynom(P[i].x)) / Math.Pow(h[i], 2) * S.x[i]; mas[i] = p1 + p2 + p3 + p4; SplinePol[i - 1] = String.Format("[{0};{1}]: {2}", P[i - 1].x, P[i].x, mas[i].ToString()); //mas[i].Show(); } //mas[0] = mas[1];mas[n + 1] = mas[n]; //создание производных сплайна Polynom[] mas1 = new Polynom[n + 1], mas2 = new Polynom[n + 1]; for (int i = 1; i <= n; i++) { mas1[i] = mas[i] | 1; mas2[i] = mas1[i] | 1; } DSpline = (double x) => { if (x <= P[1].x) { return(mas1[1].Value(x)); } if (x >= P[n].x) { return(mas1[n].Value(x)); } int i = 1; while (x > P[i].x) { i++; } return(mas1[i].Value(x)); }; D2Spline = (double x) => { if (x <= P[1].x) { return(mas2[1].Value(x)); } if (x >= P[n].x) { return(mas2[n].Value(x)); } int i = 1; while (x > P[i].x) { i++; } return(mas2[i].Value(x)); }; //создание общей функции и вывод return((double x) => { if (x <= P[1].x) { return (is0outcut) ? 0 : mas[1].Value(x); } if (x >= P[n].x) { return (is0outcut) ? 0 : mas[n].Value(x); } int i = 1; //while (x > P[i].x) i++; int i1 = 1, i2 = n; //реализация бинарного поиска while (i2 - i1 != 1) { int tmp = Expendator.Average(i1, i2); if (x > P[tmp].x) { i1 = tmp; } else { i2 = tmp; } } i = i2; return mas[i].Value(x); }); }
private void button1_Click(object sender, EventArgs e) { for (int i = 0; i < 9; i++) { Program.FORM.chart1.Series[i].Points.Clear(); } for (int i = 0; i < chart1.Series.Count; i++) { chart1.Series[i].IsVisibleInLegend = false; } for (int i = 9; i < Program.FORM.chart1.Series.Count; i++) { Program.FORM.chart1.Series.RemoveAt(i); i--; } Func <double, double> f = Math.Sin; FuncMethods.NetFunc net = new FuncMethods.NetFunc(); Func <double, double> g1, g2, g3, g4, g5, g6, g7; //SequenceFunc Monom, Leg, Cheb, Lager, Her, Trig, Har; g1 = g2 = g3 = g4 = g5 = g6 = g7 = null; //определить действительную функцию if (radioButton5.Checked) { f = (double x) => (Math.Cos(x) - 1); } if (radioButton6.Checked) { f = (double x) => (Math.Abs(x - 1)); } if (radioButton7.Checked) { f = (double x) => (Math.Exp(x - x * x)); } if (radioButton8.Checked) { f = (double x) => (Math.Exp(x) / (Math.Abs(x) + 1)); } if (radioButton9.Checked) { f = (double x) => (x * Math.Sin(x) / (Math.Abs(x) + 2)); } if (radioButton10.Checked) { f = (double x) => (x / (1 + x * x)); } if (radioButton11.Checked) { f = (double x) => (x * Math.Cos(x)); } if (radioButton12.Checked) { f = (double x) => (Math.Log(1 + Math.Abs(x))); } if (radioButton13.Checked) { f = (double x) => (x * x * x + x - 4); } if (radioButton14.Checked) { f = (double x) => (3); } if (radioButton15.Checked) { f = (double x) => (2 * x - Math.Exp(-x)); } if (radioButton16.Checked) { string s = textBox7.Text; try { f = Parser.GetDelegate(s); textBox7.Text = Parser.FORMULA; } catch { f = (double x) => 0; } } chart1.Series[0].IsVisibleInLegend = true; FileStream fs = new FileStream("Данные об аппроксимации.txt", FileMode.Create); TextWriter tmp = Console.Out; StreamWriter sw = new StreamWriter(fs); Console.SetOut(sw); const string message = "Все доступные поля должны быть заполнены действительными числами. Число шагов и число отрезков - натуральными числами. При записи действительных чисел используются запятые, а не точки. Количество заверенных точек должно быть не больше количества действительно заданных точек."; const string caption = "Неверные входные данные!"; try { int n1 = Convert.ToInt32(numericUpDown1.Value), n2 = Convert.ToInt32(numericUpDown2.Value); double[,] MAS = new double[chart1.Series.Count, n2 + 1]; //определить сеточную функцию if (!radioButton1.Checked) { double a = Convert.ToDouble(textBox1.Text), b = Convert.ToDouble(textBox2.Text); int n = Convert.ToInt16(textBox6.Text), ccount = Convert.ToInt32(numericUpDown3.Value); double h = (b - a) / (ccount - 1); Point[] mas1, mas2, mas3 = new Point[ccount]; for (int i = 0; i < ccount; i++) { mas3[i] = new Point(a + i * h, f(a + i * h)); } //чтение набора узлов int m = Convert.ToInt32(textBox4.Text); mas2 = new МатКлассы.Point[m]; string s; string[] st; for (int k = 0; k < m; k++) { s = textBox5.Lines[k]; st = s.Split(' ');//в аргументах указывается массив символов, которым разделяются числа mas2[k] = new МатКлассы.Point(Convert.ToDouble(st[0]), Convert.ToDouble(st[1])); } //чтение массива абцисс s = textBox3.Lines[0]; st = s.Split(' ');//в аргументах указывается массив символов, которым разделяются числа; m = st.Length; mas1 = new МатКлассы.Point[m]; for (int k = 0; k < m; k++) { double v = Convert.ToDouble(st[k]); mas1[k] = new МатКлассы.Point(v, f(v)); } if (radioButton2.Checked) { net = new FuncMethods.NetFunc(mas1); } else { net = new FuncMethods.NetFunc(mas2); } if (checkBox10.Checked) { net = new FuncMethods.NetFunc(mas3); } a = net.MinArg; b = net.MaxArg; if (checkBox9.Checked) { for (n = n1; n <= n2; n++) { Matrix O = new Matrix(MAS); O.PrintMatrix(); "".Show(); if (checkBox1.Checked) { SequenceFunc t = FuncMethods.Monoms; Func <double, double> g = FuncMethods.Approx(net, t, SequenceFuncKind.Other, n); if (radioButton2.Checked) { MAS[1, n] = FuncMethods.RealFuncMethods.NormDistance(f, g, a, b); } else { MAS[1, n] = FuncMethods.NetFunc.Distance(net, g); } chart1.Series[1].Points.AddXY(n, Math.Log10(MAS[1, n])); chart1.Series[1].IsVisibleInLegend = true; } if (checkBox2.Checked) { SequenceFunc t = FuncMethods.Lezhandrs(a, b); Func <double, double> g = FuncMethods.Approx(net, t, SequenceFuncKind.Orthogonal, n); if (radioButton2.Checked) { MAS[2, n] = FuncMethods.RealFuncMethods.NormDistance(f, g, a, b); } else { MAS[2, n] = FuncMethods.NetFunc.Distance(net, g); } chart1.Series[2].Points.AddXY(n, Math.Log10(MAS[2, n])); chart1.Series[2].IsVisibleInLegend = true; } if (checkBox6.Checked) { SequenceFunc t = FuncMethods.TrigSystem(a, b); Func <double, double> g = FuncMethods.Approx(net, t, SequenceFuncKind.Orthonormal, n); if (radioButton2.Checked) { MAS[6, n] = FuncMethods.RealFuncMethods.NormDistance(f, g, a, b); } else { MAS[6, n] = FuncMethods.NetFunc.Distance(net, g); } chart1.Series[6].Points.AddXY(n, Math.Log10(MAS[6, n])); chart1.Series[6].IsVisibleInLegend = true; } if (checkBox7.Checked) { SequenceFunc t = FuncMethods.HaarSystem(a, b); Func <double, double> g = FuncMethods.Approx(net, t, SequenceFuncKind.Orthogonal, n); if (radioButton2.Checked) { MAS[7, n] = FuncMethods.RealFuncMethods.NormDistance(f, g, a, b); } else { MAS[7, n] = FuncMethods.NetFunc.Distance(net, g); } chart1.Series[7].Points.AddXY(n, Math.Log10(MAS[7, n])); chart1.Series[7].IsVisibleInLegend = true; } if (checkBox8.Checked) { SequenceFunc t = (double x, int k) => Math.Exp(k * x); Func <double, double> g = FuncMethods.Approx(net, t, SequenceFuncKind.Other, n); if (radioButton2.Checked) { MAS[8, n] = FuncMethods.RealFuncMethods.NormDistance(f, g, a, b); } else { MAS[8, n] = FuncMethods.NetFunc.Distance(net, g); } chart1.Series[8].Points.AddXY(n, Math.Log10(MAS[8, n])); chart1.Series[8].IsVisibleInLegend = true; } } } else//если рисуется не график зависимости от числа функций { if (radioButton2.Checked) { net = new FuncMethods.NetFunc(mas1); Draw_mas(mas1, Color.Blue); } else { net = new FuncMethods.NetFunc(mas2); Draw_mas(mas2, Color.Blue); } if (checkBox10.Checked) { net = new FuncMethods.NetFunc(mas3); Draw_mas(mas3, Color.Blue); } a = net.MinArg; b = net.MaxArg; //ShowPoints(net);//показать точки на графике if (checkBox1.Checked) { SequenceFunc t = FuncMethods.Monoms; //SequencePol t = FuncMethods.Monom; Func <double, double> g = FuncMethods.Approx(net, t, SequenceFuncKind.Other, n); chart1.Series[1].Points.DataBindXY(МатКлассы.Point.PointsX(g, 100, a, b), МатКлассы.Point.PointsY(g, 100, a, b)); chart1.Series[1].IsVisibleInLegend = true; Console.WriteLine("--------Для системы мономов---------"); if (radioButton2.Checked) { FuncMethods.ShowApprox(f, net.Arguments, t, SequenceFuncKind.Other, n); } else { FuncMethods.ShowApprox(net, t, SequenceFuncKind.Other, n); } } //Наименьшие перпендикуляры if (n == 2) { double a0 = 0, a1 = 0; double dist = 0, distold = 0;; SLAU S = new SLAU(2); for (int i = 0; i < net.CountKnots; i++) { S.A[0, 0] += net.Arg(i); S.A[1, 0] += net.Arg(i) * net[i]; S.A[1, 1] += net[i]; S.b[1] -= net[i] * net[i]; } S.A[0, 1] = net.CountKnots; S.b[0] = -S.A[1, 1]; //S.Show(); S.GaussSelection(); a1 = S.x[0]; a0 = S.x[1]; Func <double, double> pol = new Polynom(new double[] { -a0, -a1 }).Value; SLAU T = new SLAU(FuncMethods.Monoms, net, n); T.Gauss();//T.Show(); for (int i = 0; i < net.CountKnots; i++) { dist += Math.Pow(a1 * net.Arg(i) + net[i] + a0, 2); distold += Math.Pow(T.x[1] * net.Arg(i) + net[i] + T.x[0], 2); } dist /= net.CountKnots; distold /= net.CountKnots; dist = Math.Sqrt(dist); distold = Math.Sqrt(distold); Console.WriteLine("\t(в среднеквадратичной норме перпендикуляров) равна {0}", distold); Program.FORM.chart1.Series.Add("Прямая с наилучшими перпендикулярами"); int count = Program.FORM.chart1.Series.Count - 1; Program.FORM.chart1.Series[count].Color = Color.Black; Program.FORM.chart1.Series[count].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line; //Program.FORM.chart1.Series[count].IsVisibleInLegend = false; Program.FORM.chart1.Series[count].BorderWidth = 2; chart1.Series[count].Points.DataBindXY(МатКлассы.Point.PointsX(pol, 100, a, b), МатКлассы.Point.PointsY(pol, 100, a, b)); Console.WriteLine("--------Для наименьших перпендикуляров---------"); Console.WriteLine("Аппроксимация сеточной функции полученной функцией"); Console.WriteLine("\t(в дискретной среднеквадратичной норме) равна {0}", FuncMethods.NetFunc.Distance(net, pol)); Console.WriteLine("\t(в среднеквадратичной норме перпендикуляров) равна {0}", dist); } if (checkBox2.Checked) { SequenceFunc t = FuncMethods.Lezhandrs(a, b); //SequencePol t = FuncMethods.Lezhandr(a, b); Func <double, double> g = FuncMethods.Approx(net, t, SequenceFuncKind.Orthogonal, n); chart1.Series[2].Points.DataBindXY(МатКлассы.Point.PointsX(g, 100, a, b), МатКлассы.Point.PointsY(g, 100, a, b)); chart1.Series[2].IsVisibleInLegend = true; Console.WriteLine("--------Для системы полиномов Лежандра---------"); if (radioButton2.Checked) { FuncMethods.ShowApprox(f, net.Arguments, t, SequenceFuncKind.Orthogonal, n); } else { FuncMethods.ShowApprox(net, t, SequenceFuncKind.Orthogonal, n); } } if (checkBox6.Checked) { SequenceFunc t = FuncMethods.TrigSystem(a, b); Func <double, double> g = FuncMethods.Approx(net, t, SequenceFuncKind.Orthonormal, n); chart1.Series[6].Points.DataBindXY(МатКлассы.Point.PointsX(g, 100, a, b), МатКлассы.Point.PointsY(g, 100, a, b)); chart1.Series[6].IsVisibleInLegend = true; Console.WriteLine("--------Для ортонормированной системы тригонометрических полиномов---------"); if (radioButton2.Checked) { FuncMethods.ShowApprox(f, net.Arguments, t, SequenceFuncKind.Orthonormal, n); } else { FuncMethods.ShowApprox(net, t, SequenceFuncKind.Orthonormal, n); } } if (checkBox7.Checked) { SequenceFunc t = FuncMethods.HaarSystem(a, b); Func <double, double> g = FuncMethods.Approx(net, t, SequenceFuncKind.Orthogonal, n); chart1.Series[7].Points.DataBindXY(МатКлассы.Point.PointsX(g, 100, a, b), МатКлассы.Point.PointsY(g, 100, a, b)); chart1.Series[7].IsVisibleInLegend = true; Console.WriteLine("--------Для системы Хаара---------"); if (radioButton2.Checked) { FuncMethods.ShowApprox(f, net.Arguments, t, SequenceFuncKind.Orthogonal, n); } else { FuncMethods.ShowApprox(net, t, SequenceFuncKind.Orthogonal, n); } } if (checkBox8.Checked) { SequenceFunc t = (double x, int k) => Math.Exp(k * x); Func <double, double> g = FuncMethods.Approx(net, t, SequenceFuncKind.Other, n); chart1.Series[8].Points.DataBindXY(МатКлассы.Point.PointsX(g, 100, a, b), МатКлассы.Point.PointsY(g, 100, a, b)); chart1.Series[8].IsVisibleInLegend = true; Console.WriteLine("--------Для системы экспонент---------"); if (radioButton2.Checked) { FuncMethods.ShowApprox(f, net.Arguments, t, SequenceFuncKind.Other, n); } else { FuncMethods.ShowApprox(net, t, SequenceFuncKind.Other, n); } } } } else { double a = Convert.ToDouble(textBox1.Text), b = Convert.ToDouble(textBox2.Text); int n = Convert.ToInt16(textBox6.Text); if (checkBox9.Checked) { chart1.Series[0].Name = "Функция по системе Хаара, выраженная без учёта ортогональности этой системы"; chart1.Series[0].IsVisibleInLegend = true; for (n = n1; n <= n2; n++) { if (checkBox1.Checked) { //SequenceFunc t = FuncMethods.Monoms; SequencePol t = FuncMethods.Monom; Func <double, double> g = FuncMethods.Approx(f, t, SequenceFuncKind.Other, n, a, b); MAS[1, n] = FuncMethods.RealFuncMethods.NormDistance(f, g, a, b); chart1.Series[1].Points.AddXY(n, Math.Log10(MAS[1, n])); chart1.Series[1].IsVisibleInLegend = true; chart1.Series[1].Name = "Мономы с применением ультра-гибрида"; //g = FuncMethods.Approx(f, t, SequenceFuncKind.Other, n, a, b, false); //MAS[0, n] = FuncMethods.RealFuncMethods.NormDistance(f, g, a, b); //chart1.Series[0].Points.AddXY(n, Math.Log10(MAS[0, n])); //chart1.Series[0].IsVisibleInLegend = true; } if (checkBox2.Checked) { //SequenceFunc t = FuncMethods.Lezhandrs(a,b); SequencePol t = FuncMethods.Lezhandr(a, b); Polynom s = new Polynom(new double[] { -2 * a / (b - a) - 1, 2.0 / (b - a) }); Func <double, double>[] MyMas = new Func <double, double> [n]; for (int i = 0; i < n; i++) { MyMas[i] = /*Polynom.Lezh(i).Value;*/ Polynom.Lezh(i).Value(s).Value; } //Func<double,double> g = FuncMethods.ApproxForLezhandr(f, MyMas, a, b); Func <double, double> g = FuncMethods.Approx(f, t, SequenceFuncKind.Orthogonal, n, a, b); MAS[2, n] = FuncMethods.RealFuncMethods.NormDistance(f, g, a, b); chart1.Series[2].Points.AddXY(n, Math.Log10(MAS[2, n])); chart1.Series[2].IsVisibleInLegend = true; } if (checkBox6.Checked) { SequenceFunc t = FuncMethods.TrigSystem(a, b); Func <double, double> g = FuncMethods.Approx(f, t, SequenceFuncKind.Orthonormal, n, a, b); MAS[6, n] = FuncMethods.RealFuncMethods.NormDistance(f, g, a, b); chart1.Series[6].Points.AddXY(n, Math.Log10(MAS[6, n])); chart1.Series[6].IsVisibleInLegend = true; chart1.Series[6].Name = "Тригонометрическая система с применением ультра-гибрида"; //g = FuncMethods.Approx(f, t, SequenceFuncKind.Orthonormal, n, a, b, false); //MAS[0, n] = FuncMethods.RealFuncMethods.NormDistance(f, g, a, b); //chart1.Series[0].Points.AddXY(n, Math.Log10(MAS[0, n])); //chart1.Series[0].IsVisibleInLegend = true; } if (checkBox7.Checked) { SequenceFunc t = FuncMethods.HaarSystem(a, b); Func <double, double> g = FuncMethods.Approx(f, t, SequenceFuncKind.Orthogonal, n, a, b); MAS[7, n] = FuncMethods.RealFuncMethods.NormDistance(f, g, a, b); chart1.Series[7].Points.AddXY(n, Math.Log10(MAS[7, n])); chart1.Series[7].IsVisibleInLegend = true; chart1.Series[7].Name = "Система Хаара как ортогональная система"; //g = FuncMethods.Approx(f, t, SequenceFuncKind.Other, n, a, b, false); //MAS[0, n] = FuncMethods.RealFuncMethods.NormDistance(f, g, a, b); //chart1.Series[0].Points.AddXY(n, Math.Log10(MAS[0, n])); //chart1.Series[0].IsVisibleInLegend = true; } if (checkBox8.Checked) { SequenceFunc t = (double x, int k) => Math.Exp(k * x); Func <double, double> g = FuncMethods.Approx(f, t, SequenceFuncKind.Other, n, a, b); MAS[8, n] = FuncMethods.RealFuncMethods.NormDistance(f, g, a, b); chart1.Series[8].Points.AddXY(n, Math.Log10(MAS[8, n])); chart1.Series[8].IsVisibleInLegend = true; chart1.Series[8].Name = "Экспоненты с применением ультра-гибрида"; //g = FuncMethods.Approx(f, t, SequenceFuncKind.Other, n, a, b, false); //MAS[0, n] = FuncMethods.RealFuncMethods.NormDistance(f, g, a, b); //chart1.Series[0].Points.AddXY(n, Math.Log10(MAS[0, n])); //chart1.Series[0].IsVisibleInLegend = true; } } Analys(MAS, n1, n2); } else { chart1.Series[0].Points.DataBindXY(МатКлассы.Point.PointsX(f, 100, a, b), МатКлассы.Point.PointsY(f, 100, a, b)); if (checkBox1.Checked) { //SequenceFunc t = FuncMethods.Monoms; SequencePol t = FuncMethods.Monom; Func <double, double> g = FuncMethods.Approx(f, t, SequenceFuncKind.Other, n, a, b); chart1.Series[1].Points.DataBindXY(МатКлассы.Point.PointsX(g, 100, a, b), МатКлассы.Point.PointsY(g, 100, a, b)); chart1.Series[1].IsVisibleInLegend = true; Console.WriteLine("--------Для системы мономов---------"); FuncMethods.ShowApprox(f, t, SequenceFuncKind.Other, n, a, b); } if (checkBox2.Checked) { //SequenceFunc t = FuncMethods.Lezhandrs(a,b); SequencePol t = FuncMethods.Lezhandr(a, b); Polynom s = new Polynom(new double[] { -2 * a / (b - a) - 1, 2.0 / (b - a) }); Func <double, double>[] MyMas = new Func <double, double> [n]; for (int i = 0; i < n; i++) { MyMas[i] = /*Polynom.Lezh(i).Value;*/ Polynom.Lezh(i).Value(s).Value; } Func <double, double> g = FuncMethods.ApproxForLezhandr(f, MyMas, a, b); chart1.Series[2].Points.DataBindXY(МатКлассы.Point.PointsX(g, 100, a, b), МатКлассы.Point.PointsY(g, 100, a, b)); chart1.Series[2].IsVisibleInLegend = true; Console.WriteLine("--------Для системы полиномов Лежандра---------"); FuncMethods.ShowApprox(f, t, SequenceFuncKind.Orthogonal, n, a, b); } if (checkBox3.Checked) { //SequencePol t = FuncMethods.Cheb(a,b); SequenceFunc t = FuncMethods.Chebs(a, b); Func <double, double> g = FuncMethods.Approx(f, t, SequenceFuncKind.Other, n, a, b); chart1.Series[3].Points.DataBindXY(МатКлассы.Point.PointsX(g, 100, a, b), МатКлассы.Point.PointsY(g, 100, a, b)); chart1.Series[3].IsVisibleInLegend = true; } if (checkBox4.Checked) { SequenceFunc t = FuncMethods.Lagerrs(a, b); Func <double, double> g = FuncMethods.Approx(f, t, SequenceFuncKind.Other, n, a, b); chart1.Series[4].Points.DataBindXY(МатКлассы.Point.PointsX(g, 100, a, b), МатКлассы.Point.PointsY(g, 100, a, b)); chart1.Series[4].IsVisibleInLegend = true; } if (checkBox5.Checked) { SequenceFunc t = FuncMethods.Hermits(a, b); Func <double, double> g = FuncMethods.Approx(f, t, SequenceFuncKind.Other, n, a, b); chart1.Series[5].Points.DataBindXY(МатКлассы.Point.PointsX(g, 100, a, b), МатКлассы.Point.PointsY(g, 100, a, b)); chart1.Series[5].IsVisibleInLegend = true; } if (checkBox6.Checked) { SequenceFunc t = FuncMethods.TrigSystem(a, b); Func <double, double> g = FuncMethods.Approx(f, t, SequenceFuncKind.Orthonormal, n, a, b); chart1.Series[6].Points.DataBindXY(МатКлассы.Point.PointsX(g, 100, a, b), МатКлассы.Point.PointsY(g, 100, a, b)); chart1.Series[6].IsVisibleInLegend = true; Console.WriteLine("--------Для ортонормированной системы тригонометрических полиномов---------"); FuncMethods.ShowApprox(f, t, SequenceFuncKind.Orthonormal, n, a, b); } if (checkBox7.Checked) { SequenceFunc t = FuncMethods.HaarSystem(a, b); Func <double, double> g = FuncMethods.Approx(f, t, SequenceFuncKind.Orthogonal, n, a, b); chart1.Series[7].Points.DataBindXY(МатКлассы.Point.PointsX(g, 100, a, b), МатКлассы.Point.PointsY(g, 100, a, b)); chart1.Series[7].IsVisibleInLegend = true; Console.WriteLine("--------Для системы Хаара---------"); FuncMethods.ShowApprox(f, t, SequenceFuncKind.Orthogonal, n, a, b); } if (checkBox8.Checked) { SequenceFunc t = (double x, int k) => Math.Exp(k * x); Func <double, double> g = FuncMethods.Approx(f, t, SequenceFuncKind.Other, n, a, b); chart1.Series[8].Points.DataBindXY(МатКлассы.Point.PointsX(g, 100, a, b), МатКлассы.Point.PointsY(g, 100, a, b)); chart1.Series[8].IsVisibleInLegend = true; Console.WriteLine("--------Для системы экспонент---------"); FuncMethods.ShowApprox(f, t, SequenceFuncKind.Other, n, a, b); } } } } catch { var MBSave = MessageBox.Show(message, caption, MessageBoxButtons.OK, MessageBoxIcon.Error); return; } finally { sw.Close(); Console.SetOut(tmp); Console.WriteLine("Запись завершена!"); Program.DATA.textBox1.Text = ""; StreamReader sr = new StreamReader("Данные об аппроксимации.txt"); string ss = ""; while (ss != null) { Program.DATA.textBox1.Text += ss + Environment.NewLine; ss = sr.ReadLine(); } sr.Close(); } }