public static void Main() { Console.WriteLine("Классические ортогональные многочлены"); Console.Write("Введите степень многочлена: "); int n = int.Parse(Console.ReadLine()); Console.WriteLine("Корни многочлена Лежандра: "); WriteAllRoots((double x) => LegendrePolynom(x, n), -1, 1); PlotFunction(x => LegendrePolynom(x, n), -1, 1, "legendre.png"); Console.WriteLine("Корни многочлена Чебышева 1 рода:"); WriteAllRoots(x => ChebyshevPolynom(x, n), -1, 1); PlotFunction(function: x => ChebyshevPolynom(x, n), -1, 1, "chebyshev.png"); PlotFunction(function: x => ChebyshevPolynom(x, n) / Math.Pow(2, n - 1), -1, 1, "chebyshev-reduced.png"); WriteChebyshevExtremas(n); Console.WriteLine("Корни многочлена Чебышёва-Эрмита:"); WriteAllRoots((double x) => ChebyshevHermitePolynom(x, n), -5, 5); PlotFunction(x => ChebyshevHermitePolynom(x, n), -2, 2, "hermite.png"); Console.WriteLine("Корни многочлена Чебышева-Легерра:"); WriteAllRoots((double x) => ChebyshevLegarrPolynom(x, n), 0, 20); PlotFunction(x => ChebyshevLegarrPolynom(x, n), 0, 20, "legerre.png"); // TODO: убрать этот костыль GnuPlot.Replot(); }
/// <summary> /// Строит график заданной фукнции в указанных границах. График записывается в файл по заданному пути. /// </summary> /// <param name="function">Функция, график которой строим</param> /// <param name="leftBorder">Левая граница промежутка</param> /// <param name="rightBorder">Правая граница промежутка</param> /// <param name="outputFileName">Путь итогового графика</param> private static void PlotFunction( Func <double, double> function, double leftBorder, double rightBorder, String outputFileName) { const double step = 0.01; GnuPlot.Set("terminal png size 400,400", $"output '{outputFileName}'"); var pointsCount = (int)((rightBorder - leftBorder) / step) + 1; var x = new double[pointsCount]; var y = new double[pointsCount]; int i = 0; for (double point = leftBorder; point <= rightBorder; point += step) { x[i] = point; y[i] = function(point); ++i; } GnuPlot.Plot(x, y); }