Skip to content

Latest commit

 

History

History
194 lines (126 loc) · 11.2 KB

NM_01.md

File metadata and controls

194 lines (126 loc) · 11.2 KB

Численные методы

Лабораторная работа № 1

"Численные исследования сходимости многочлена Лагранжа к приближаемой функции при увеличении степени многочлена"

Задание:

  1. Написать программу, исходные данные: дан отрезок [a, b] - вводим с клавиатуры, и функция f = (1-x) / (1 + x^2), по которой будем считать значения в узлах. Используем многочлен второй степени (3 узла), и они равноотстощие на отрезке [a, b]. С помощью двойного цикла запрограммировать вычисление многочлена Лагранжа в произволной точке x.

  2. Функция f задана таблицей значений. Найти с помощью многочлена Лагранжа L2(x) приближенное значение функции в точках x* = 1.5 и x** = 2.5

UPD: Решение на С++ UPD: Решение на С++ с графиком на OpenGL UPD: Решение на Matlab UPD: Решение на Python UPD: Решение на C# UPD: Решение на JavaScript

Отчет л.р. №1 Word и PDF

Демо на JavaScript Демо

Методичка к лаб.раб. №1 Гудович Н.Н. Методичка №1


Трекинг и описание

2017-09-15, UPD 2017-10-05

Добавлено решение задачи №1 (С++)

Задание: (интерполяция полиномом Лагранжа)

  1. Написать программу, исходные данные: дан отрезок [a, b] - вводим с клавиатуры, и функция, по которой будем считать значения в узлах. Используем многочлен второй степени (3 узла), и они равноотстощие на отрезке [a, b]. С помощью двойного цикла запрограммировать вычисление многочлена Лагранжа в произволной точке x. --- См. interpolate1
double interpolate1(double a, double b, int size, double xx, func f);
  1. Функция 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


2017-09-15

UPD: добавил решение задачи №1 (Matlab) с выводом графиков.

Задание: (интерполяция полиномом Лагранжа)

В папке две основные функции: 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


2017-09-20

UPD: добавил решение задачи №1 на Python (Jupyter Notebook) с выводом графиков.

UPD: Решение на Python


2017-09-24

UPD: добавил к решению задачи №1 (Matlab) вывод полного графика функции и графика полинома.

Все оформлено в отдельную функцию без возвращаемых параметров interpolate3.m, вызов следующего вида (как пример):

interpolate3(a, b, size)

где a и b - концы отрезка, size - степень полинома Лагранжа. Получим окно с графиком:

Пример графика

Кроме того, добавил пару функций для расчета абсолютной погрешности: delta.m и deltaPlot.m. Первая из них вычисляет погрешность между функцией и полиномом Лагранжа, вторая строит график зависимости погрешности от степени полинома Лагранжа:

deltaPlot(a, b, size1, size2)

где a и b - концы отрезка, size1 и size2 - начальная и конечная степень полинома Лагранжа. Получим окно с графиком:

Зависимость погрешности от степени полинома

UPD: Решение на Matlab


2017-09-24

UPD: добавил решение на C# на основе WinForms и свободной библиотеки ZedGraph.

Окошко имеет вид:

Пример графика

UPD: Решение на C#


2017-09-24

UPD: к решению на MatLab добавил два дополнительных модуля: polyval1.m и polyval2.m, а также вызывающую их вспомогательную функцию interpolate4diff.m.

В модуле polyval1.m вычисление значения интерполяционного многочлена в точке реализовано таким образом, чтобы в одном цикле выполнялось и умножение, и деление на знаменатель, а в модуле polyval2.m эти вычисления разнесены на два цикла, по одному на вычисление числителя и на вычисление знаменателя. На рисунке ниже приведены результаты работы функции interpolate4diff.m для степени интерполяционного многчлена равной 100. Синим цветом выведен график полинома, значения точек которого посчитаны методом модуля polyval1.m, а зеленым – модуля polyval2.m.

Сравнение точности двух способов расчета

UPD: Решение на Matlab


2017-09-29

UPD: добавил отчет л.р. №1 Word PDF


2017-10-01

UPD: добавил решение на JavaScript с использованием Google Charts.

Внешний вид странички html с работающим скриптом:

Пример графика

UPD: Решение на JavaScript UPD: Демо


2017-10-02

UPD: добавил к решению на JavaScript демку на сайте io.do.am.

Посмотреть можно тут:

UPD: Демо


2017-10-05

UPD: добавил решение на C++ с выводом графиков на OpenGL.

UPD: Решение на С++ с графиком на OpenGL