Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Предварительные рекомендации




Для успешного выполнения данной лабораторной работы Вам следует ознакомиться со следующими рекомендациями.

Рассмотрим особенности реализации алгоритма интерполирования по Лагранжу.

Пусть установлено, что исследуемое значение аргумента принадлежит -му отрезку интерполирования, т.е. .

Введем обозначение для частичного интервала интерполирования, содержащего в себе отрезок , а также ровно отрезков интерполирования ( узел) из исходной таблицы данных:

Наша первоочередная задача – вычислить индексы и узлов-границ частичного интервала при условии, что отрезок должен располагаться «посередине» этого интервала.

Такой подход обеспечит наилучшее для многочлена Лагранжа «качество» аппроксимации табличной функции и ее производной для значения аргумента .

Таким образом, алгоритм вычисления значений индексов и представляет собой самостоятельную проблему. По этой причине мы будем его разрабатывать и отлаживать в рамках отдельного, вспомогательного консольного приложения (например, на Fortran).

Указанный алгоритм должен учитывать следующие моменты:

· порядок интерполяционного многочлена может быть как четным, так и нечетным числом;

· значение аргумента может быть близко к границам ( или ) исходной таблицы данных, так что указанный выше принцип размещения отрезка «посередине» интервала не может быть реализован.

Будем определять индексы и с использованием известных арифметических функций и , выполняющих преобразование действительного числа к целому:

(11.4)

где для четных значений будет (11.5)

а для нечетных значений будет (11.6)

Например, при имеем см. рисунок выше по тексту, (11.7)

а при имеем (11.8)

Такие результаты обусловлены правилами функций и . Их суть легко усвоить из примера:

(11.9)

Следовательно, первая функция – – у положительного действительного числа просто «отбрасывает» дробную часть, а вторая функция – – увеличивает до ближайшего целого.

Если при реализации алгоритма (11.4) индекс оказывается отрицательным, то это означает, что значение аргумента размещается «близко» к узлу и интервал нельзя расположить «посередине» интервала .

В таком случае мы в качестве индекса будем брать , т.е. , а индексу дадим значение , т.е. . (11.10)

Если же при реализации алгоритма (11.4) индекс окажется больше, чем , то это означает, что значение аргумента размещается «близко» к узлу и интервал также нельзя расположить «посередине» интервала .

В этой ситуации мы поступим аналогично предыдущему случаю: индексу дадим значение , т.е. , а индексу – значение , т.е. . (11.11)

Во всех трех перечисленных случаях для частичного интервала интерполирования будет выделено из основной таблицы ровно интервалов ( узел интерполирования).

Все выше сказанное реализуем в отдельном проекте AddAlgorithm_11 консольного приложения на языке программирования Fortran.

Для простоты анализа результатов массив узлов исходной таблицы разместим в точках с целыми значениями координат, например, равными их индексу, а в качестве «исследуемых» точек будем выбирать середины полученных отрезков интерполирования.

При таких условиях код основной программной единицы будет следующим:

Ниже приводятся результаты для одного из тестовых расчетов:

Вернемся теперь к формуле (11.1). С использованием новой безразмерной переменной ее можно представить в виде:

, где . (11.12)

Каждое е слагаемое, стоящее под знаком суммы в (11.12) представляет собой произведение коэффициента на многочлен степени , записанный в виде произведения , в котором отсутствует скобка .

Производная от многочлена Лагранжа будет иметь вид:

. (11.13)

Таким образом, каждое е слагаемое, стоящее под знаком суммы в (11.13) будет представлять собой произведение коэффициента на производную от произведения .

Отметим, что в этом произведении всего сомножителей, поскольку отсутствует скобка .

Производная произведения, в свою очередь, может быть представлена в виде следующей суммы:

. (11.14)

Каждое е слагаемое такой суммы является произведением из сомножителей, в котором отсутствуют скобки и .

Подведем общий итог рассуждениям. Формула (11.13) представляет собой сумму из слагаемого (по от 0 до ), каждое из которых представляет собой сумму (11.14) из слагаемых (по от 0 до , без слагаемого с ), каждое из которых, в свою очередь, есть произведение из сомножителей (по от 0 до , без сомножителей и ).

Если при построении многочлена (11.13) мы будем использовать только отрезков интерполирования, непосредственно примыкающих к значению , то нам придется воспользоваться уже отлаженным алгоритмом определения границ частичного интервала интерполирования.

В этом случае параметр в формулах (11.13) и (11.14) будет принимать значение , а безразмерная переменная будет вычисляться как , а сама формула (11.13) примет вид

. (11.15)

Остается только реализовать формулу (11.15) в виде соответствующей программной единицы.

Обратимся теперь к формулам (11.2) и (11.3) интерполирования по Ньютону. Выполним в этих формулах замену переменной следующего вида:

· для первой интерполяционной формулы – , когда ;

· для второй интерполяционной формулы – , когда .

Тогда будем иметь (с учетом того, что степень интерполяционного многочлена будет ):

, (11.16)

. (11.17)

Дифференцирование обеих формул дает следующие выражения:

, (11.18)

. (11.19)

Выше мы уже обсуждали вид производной от произведения нескольких сомножителей. В данном случае каждое из слагаемых (кроме первых) в суммах (11.18) и (11.19) содержит производную от произведения сомножителей, количество которых равно – «номеру» слагаемого в этой сумме. При этом, в отличие от случая Лагранжа, в этом произведении нет «отсутствующих» скобок.

Поэтому алгоритм вычисления слагаемых в суммах (11.18) и (11.19) будет проще:

для го слагаемого в (11.18) ; (11.20)

для го слагаемого в (11.19) . (11.21)

Следующее соображение касается построения таблицы конечных разностей. Поскольку степень интерполяционного многочлена задана, то нет смысла вычислять разности порядков, старше чем .

Теперь Вы можете приступать к непосредственному программированию по данной работе.

Пример выполнения лабораторного задания на Fortran

Воспользуемся уже разработанными компонентами из лабораторных работ № 8 и № 9, а в качестве исследуемой функции возьмем зависимость

, . (11.22)

Стартуем среду разработки MS Visual Studio. Создадим новый проект LabTask_11f и сгенерируем в нем файл основной программной единицы – main_11.f90.

Включим в проект файл y(x)_dy(x).f90 со следующими программными единицами, представляющими собой функции (11.22):

Реализуем алгоритм (11.15) интерполирования по Лагранжу для производной от таблично заданной функции следующим образом:

Здесь переменная xx есть исследуемое значение аргумента .

Обозначения всех остальных переменных выполнены максимально близко к обозначениям, принятым в выше приведенных формулах.

Алгоритмы (11.18)–(11.21) интерполирования по Ньютону объединим в рамках одной программной единицы:

Объединим интерфейсы к разработанным программным единицам в рамках одного модуля:

Раздел описаний основной программной единицы может быть следующим:

Основные действия программы указаны в комментариях, поэтому мы предоставляем Вам возможность самостоятельно разобраться в сути производимых преобразований над числовыми данными:

Выполнение данной программной единицы требует ввода данных, например:

Таблица результатов (файл Table_dy.txt) интерполирования по Лагранжу для производной функции (11.22) будет иметь следующий вид:

n = 21 m = 7

x y(x) y'(x) Ln'(x) abs_err otn_err

1.0000 2.439737 -10.460448 -10.466503 0.006056 0.058 %

1.0238 2.145598 -14.126488 -14.125279 0.001209 0.009 %

1.0476 1.773570 -16.972276 -16.971319 0.000957 0.006 %

1.0714 1.345186 -18.838069 -18.838239 0.000170 0.001 %

1.0952 0.885142 -19.619399 -19.619747 0.000348 0.002 %

1.1190 0.419897 -19.272966 -19.272930 0.000036 0.000 %

1.1429 -0.023813 -17.819080 -17.818854 0.000226 0.001 %

1.1667 -0.420483 -15.340516 -15.340512 0.000005 0.000 %

1.1905 -0.747283 -11.977845 -11.978087 0.000242 0.002 %

1.2143 -0.985341 -7.921499 -7.921496 0.000002 0.000 %

1.2381 -1.120807 -3.401028 -3.401374 0.000347 0.010 %

1.2619 -1.145637 1.327850 1.327850 0.000000 0.000 %

1.2857 -1.058046 5.997679 5.997304 0.000375 0.006 %

1.3095 -0.862603 10.344354 10.344351 0.000003 0.000 %

1.3333 -0.569982 14.122023 14.121704 0.000319 0.002 %

1.3571 -0.196350 17.116960 17.116955 0.000005 0.000 %

1.3810 0.237539 19.159618 19.159425 0.000193 0.001 %

1.4048 0.707520 20.134202 20.134196 0.000006 0.000 %

1.4286 1.187377 19.985196 19.985172 0.000024 0.000 %

1.4524 1.650325 18.720498 18.720493 0.000006 0.000 %

1.4762 2.070521 16.410976 16.411127 0.000151 0.001 %

1.5000 2.424524 13.186463 13.186460 0.000004 0.000 %

1.5238 2.692615 9.228438 9.228730 0.000292 0.003 %

1.5476 2.859913 4.759781 4.759780 0.000001 0.000 %

1.5714 2.917213 0.032199 0.032568 0.000368 1.130 %

1.5952 2.861505 -4.687973 -4.687972 0.000001 0.000 %

1.6190 2.696149 -9.134808 -9.134445 0.000362 0.004 %

1.6429 2.430680 -13.057780 -13.057776 0.000004 0.000 %

1.6667 2.080273 -16.235910 -16.235634 0.000276 0.002 %

1.6905 1.664887 -18.490230 -18.490224 0.000006 0.000 %

1.7143 1.208140 -19.693879 -19.693751 0.000128 0.001 %

1.7381 0.735975 -19.779267 -19.779261 0.000006 0.000 %

1.7619 0.275198 -18.741884 -18.741932 0.000048 0.000 %

1.7857 -0.148035 -16.640556 -16.640551 0.000005 0.000 %

1.8095 -0.509694 -13.594127 -13.594341 0.000214 0.002 %

1.8333 -0.789229 -9.774757 -9.774754 0.000003 0.000 %

1.8571 -0.970728 -5.398202 -5.398533 0.000332 0.006 %

1.8810 -1.043821 -0.711645 -0.711714 0.000069 0.010 %

1.9048 -1.004256 4.020248 4.020814 0.000567 0.014 %

1.9286 -0.854145 8.530264 8.530586 0.000322 0.004 %

1.9524 -0.601842 12.563720 12.561988 0.001732 0.014 %

1.9762 -0.261473 15.892830 15.890370 0.002460 0.015 %

2.0000 0.147863 18.329556 18.341838 0.012282 0.067 %

Другая таблица, для интерполирования по Ньютону, будет содержать следующие данные:

x y(x) y'(x) Nt'(x) abs_err otn_err

1.0000 2.439737 -10.460448 -10.466503 0.006056 0.058 %

1.0238 2.145598 -14.126488 -14.125279 0.001209 0.009 %

1.0476 1.773570 -16.972276 -16.971319 0.000957 0.006 %

1.0714 1.345186 -18.838069 -18.835940 0.002129 0.011 %

1.0952 0.885142 -19.619399 -19.617813 0.001585 0.008 %

1.1190 0.419897 -19.272966 -19.270390 0.002576 0.013 %

1.1429 -0.023813 -17.819080 -17.817218 0.001861 0.010 %

1.1667 -0.420483 -15.340516 -15.338067 0.002449 0.016 %

1.1905 -0.747283 -11.977845 -11.976122 0.001723 0.014 %

1.2143 -0.985341 -7.921499 -7.919721 0.001777 0.022 %

1.2381 -1.120807 -3.401028 -3.399826 0.001201 0.035 %

1.2619 -1.145637 1.327850 1.328560 0.000710 0.053 %

1.2857 -1.058046 5.997679 5.998091 0.000412 0.007 %

1.3095 -0.862603 10.344354 10.343839 0.000515 0.005 %

1.3333 -0.569982 14.122023 14.121555 0.000468 0.003 %

1.3571 -0.196350 17.116960 17.115335 0.001625 0.009 %

1.3810 0.237539 19.159618 19.158373 0.001245 0.006 %

1.4048 0.707520 20.134202 20.131828 0.002374 0.012 %

1.4286 1.187377 19.985196 19.983451 0.001744 0.009 %

1.4524 1.650325 18.720498 18.717904 0.002595 0.014 %

1.4762 2.070521 16.410976 16.409120 0.001856 0.011 %

1.5000 2.424524 13.186463 13.184225 0.002238 0.017 %

1.5238 2.692615 9.228438 9.226884 0.001554 0.017 %

1.5476 2.859913 4.759781 4.760035 0.000254 0.005 %

1.5714 2.917213 0.032199 0.030950 0.001249 4.036 %

1.5952 2.861505 -4.687973 -4.686562 0.001411 0.030 %

1.6190 2.696149 -9.134808 -9.141842 0.007034 0.077 %

1.6429 2.430680 -13.057780 -13.055525 0.002255 0.017 %

1.6667 2.080273 -16.235910 -16.247165 0.011254 0.069 %

1.6905 1.664887 -18.490230 -18.487633 0.002596 0.014 %

1.7143 1.208140 -19.693879 -19.706850 0.012970 0.066 %

1.7381 0.735975 -19.779267 -19.776907 0.002361 0.012 %

1.7619 0.275198 -18.741884 -18.753684 0.011800 0.063 %

1.7857 -0.148035 -16.640556 -16.638956 0.001599 0.010 %

1.8095 -0.509694 -13.594127 -13.602132 0.008005 0.059 %

1.8333 -0.789229 -9.774757 -9.774275 0.000482 0.005 %

1.8571 -0.970728 -5.398202 -5.400630 0.002428 0.045 %

1.8810 -1.043821 -0.711645 -0.712387 0.000742 0.104 %

1.9048 -1.004256 4.020248 4.023936 0.003689 0.092 %

1.9286 -0.854145 8.530264 8.528463 0.001801 0.021 %

1.9524 -0.601842 12.563720 12.572705 0.008985 0.071 %

1.9762 -0.261473 15.892830 15.890370 0.002460 0.015 %

2.0000 0.147863 18.329556 18.341838 0.012282 0.067 %

Анализ двух представленных таблиц свидетельствует в пользу алгоритма по Лагранжу. Причина этого – принцип размещения значения «посередине» частичного интервала интерполирования , реализованный нами в функции dLn().

Можно отметить, что качество интерполирования по Ньютону может быть всегда улучшено за счет увеличения порядка для старшей конечной разности, участвующей в вычислениях.

Пример выполнения лабораторного задания на языке C#

В имеющемся рабочем пространстве NMM_PetrovIS сгенерируем (добавим) новый проект LabTask_11с консольного приложения на языке программирования C#.

Включим в проект класс – Class_11, в котором разместим программные компоненты – аналоги разработанных выше алгоритмов. Никакие принципиально новые приемы программирования мы здесь использовать не будем, поэтому коды программных компонентов приводим без комментариев:

Кроме того, коды функций func_y() и func_dy() в соответствии с формулами (11.22) Вам уже под силу сформировать самостоятельно.

Напомним здесь, что для сохранения результатов вычислений в виде файла на жестком диске, нам необходимо подключить в основной программной единице пространство имен System.IO.

Аналог основной программной единицы main_11 (на Fortran) на языке C# может иметь, например, следующий вид:

Сравнение кодов на C# и Fortran, реализующих операции форматного вывода в текстовый файл, безусловно, говорит в пользу Fortran. В частности, операторы format позволяют более гибко организовывать форматный ввод/вывод и не «загромождают» основной код программы, поскольку могут быть записаны в любом месте программной единицы (неисполняемые операторы).

Компиляция проекта LabTask_11с и тестовый расчет дают результаты (файл LabTask_11с.txt), идентичные тем, что были получены в проекте LabTask_11f и приведены выше в виде таблиц (файл Table_dy.txt).

Последнее свидетельствует в пользу того, что цель данной лабораторной работы достигнута.

Отладка данной лабораторной работы (на обоих языках программирования) должна производиться на функциях (11.22), а затем на функциях из Вашего варианта.

Только после того, как Вами будут получены результаты, совпадающие с приведенными выше, Вы можете приступать к вычислениям для своих данных.


Контроль выполнения варианта лабораторного задания № 11

Для контроля правильности Вашего выполнения лабораторной работы № 11 воспользуйтесь уже известным Вам приложением NMM_Labs.

Выберите требуемую лабораторную работу и свой вариант. После этого – нажмите на кнопку «Выполнить» – перед Вами появится следующая форма:

Пользователю предоставляется возможность вычислять значение для таблично заданной функции, а также ее производной, при помощи одного из двух интерполяционных многочленов. Выбор многочлена производится путем «включения» соответствующей радио-кнопки из группы «Интерполяционный многочлен».

Напомним, что вводимое значение аргумента должно быть в пределах отрезка интерполирования.

Кроме того, Вы можете задать другое «Количество интервалов основной таблицы», например – 25, которое при начальной загрузке имеет минимальное значение – 20.

Для исследования влияния степени многочлена на относительную погрешность вычисления Вы можете увеличивать этот параметр (от 4 до 9).

После того, как выбран интерполяционный многочлен, например – Лагранжа, и задано конкретное значение аргумента, необходимо нажать на кнопку «Вычислить значение функции и ее производной»:

Основной результат интерполирования размещается внизу формы.

Для наглядности работы данного расчетного алгоритма (интерполирования по Лагранжу), а также для облегчения отладки Вашей программы, выводится таблица функции и ее производной, рассчитанные по аналитическим формулам.

Если же был выбран многочлен Ньютона, то форма с результатами будет иметь вид:

Здесь также выводится дополнительная информация, раскрывающая особенности интерполирования по Ньютону, и позволяющая производить отладку подобной программы.

Вам следует выполнить ряд вычислений для различных значений аргумента и для обоих методов интерполирования, чтобы убедиться в корректности работы Вашей программы по данной лабораторной работе.

Работа считается выполненной, если результаты, полученные Вашей программой для значений аргумента из «верхней», «средней» и «нижней» частей расчетных таблиц (файлов Table_dy.txt или LabTask_11с.txt) совпадут с результатами программы NMM_Labs.




Поделиться с друзьями:


Дата добавления: 2014-12-23; Просмотров: 497; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.114 сек.