"Численные исследования сходимости многочлена Лагранжа к приближаемой функции при увеличении степени многочлена"
-
Написать программу, исходные данные: дан отрезок [a, b] - вводим с клавиатуры, и функция f = (1-x) / (1 + x^2), по которой будем считать значения в узлах. Используем многочлен второй степени (3 узла), и они равноотстощие на отрезке [a, b]. С помощью двойного цикла запрограммировать вычисление многочлена Лагранжа в произволной точке x.
-
Функция f задана таблицей значений. Найти с помощью многочлена Лагранжа L2(x) приближенное значение функции в точках x* = 1.5 и x** = 2.5
UPD: Решение на С++ UPD: Решение на С++ с графиком на OpenGL UPD: Решение на Matlab UPD: Решение на Python UPD: Решение на C# UPD: Решение на JavaScript
Демо на JavaScript Демо
Методичка к лаб.раб. №1 Гудович Н.Н. Методичка №1
Теория к лаб.раб. №1 Гудович Н.Н. Избранные вопросы курса ЧМ. Выпуск 1. Многочлен Лагранжа
Задание: (интерполяция полиномом Лагранжа)
- Написать программу, исходные данные: дан отрезок [a, b] - вводим с клавиатуры, и функция, по которой будем считать значения в узлах. Используем многочлен второй степени (3 узла), и они равноотстощие на отрезке [a, b]. С помощью двойного цикла запрограммировать вычисление многочлена Лагранжа в произволной точке x. --- См. interpolate1
double interpolate1(double a, double b, int size, double xx, func f);
- Функция f задана таблицей значений. Найти с помощью многочлена Лагранжа L2(x) приближенное значение функции в точках x* = 1.5 и x** = 2.5 --- См. interpolate2
double interpolate2(vector<double> X, vector<double> Y, double xx);
UPD 2017-10-05: сделал вывод графика на OpenGL с использованием бибилиотеки glut. Выглядет пока довольно корявенько, многое приходится делать ручками, например, вывод осей, сетки, засечек, расчет смешения от центра. Пока вот как-то так:
Работает на Windows / разработка в Visual Studio 2017, под линукс пока не запустил, надо попробовать позже. Вот тут ссылка на необходимые библиотеки, а вот неплохой видео мануал, как все это подключить к Visual Studio и заставить работать.
LINK: Решение на С++ UPD: Решение на С++ с графиком на OpenGL
Задание: (интерполяция полиномом Лагранжа)
В папке две основные функции: interpolate1.m и interpolate2.m Сама исходная оригинальная функция, по которой рассчитываются узлы, в файле f.m. Чтобы вызвать расчет интерполяции, зная только границы отрезка и точку x (пусть она = 2.5), необходимо в командной строке матлаба ввести и выполнить:
[Lx, Fx, d] = interpolate1(-1, 3, 2, 2.5)
Чтобы вызвать расчет интерполяции по известным узлам, необходимо в командной строке матлаба сначала сформировать эти узлы, например:
X = [1; 2; 3];
Y = [-2; 1; 6];
а затем уже выполнить по ним интерполяцию для точки x = 2.5:
[Lx, Fx, d] = interpolate2(X, Y, 2.5)
Или можно выполнить в командной строке файл main.m, в котором все это уже есть с комментариями. В итоге сформируется новое окно с графиком такого вида:
LINK: Решение на Matlab
UPD: Решение на Python
Все оформлено в отдельную функцию без возвращаемых параметров interpolate3.m, вызов следующего вида (как пример):
interpolate3(a, b, size)
где a и b - концы отрезка, size - степень полинома Лагранжа. Получим окно с графиком:
Кроме того, добавил пару функций для расчета абсолютной погрешности: delta.m и deltaPlot.m. Первая из них вычисляет погрешность между функцией и полиномом Лагранжа, вторая строит график зависимости погрешности от степени полинома Лагранжа:
deltaPlot(a, b, size1, size2)
где a и b - концы отрезка, size1 и size2 - начальная и конечная степень полинома Лагранжа. Получим окно с графиком:
UPD: Решение на Matlab
Окошко имеет вид:
UPD: Решение на C#
UPD: к решению на MatLab добавил два дополнительных модуля: polyval1.m и polyval2.m, а также вызывающую их вспомогательную функцию interpolate4diff.m.
В модуле polyval1.m вычисление значения интерполяционного многочлена в точке реализовано таким образом, чтобы в одном цикле выполнялось и умножение, и деление на знаменатель, а в модуле polyval2.m эти вычисления разнесены на два цикла, по одному на вычисление числителя и на вычисление знаменателя. На рисунке ниже приведены результаты работы функции interpolate4diff.m для степени интерполяционного многчлена равной 100. Синим цветом выведен график полинома, значения точек которого посчитаны методом модуля polyval1.m, а зеленым – модуля polyval2.m.
UPD: Решение на Matlab
UPD: добавил решение на JavaScript с использованием Google Charts.
Внешний вид странички html с работающим скриптом:
UPD: Решение на JavaScript UPD: Демо
UPD: добавил к решению на JavaScript демку на сайте io.do.am.
Посмотреть можно тут:
UPD: Демо
UPD: добавил решение на C++ с выводом графиков на OpenGL.
UPD: Решение на С++ с графиком на OpenGL