Лабораторная работа №9 Тема: «Вычисление значения таблично заданной функции с использованием алгоритма интерполирования по Ньютону» icon

Лабораторная работа №9 Тема: «Вычисление значения таблично заданной функции с использованием алгоритма интерполирования по Ньютону»


Скачать 42.04 Kb.
НазваниеЛабораторная работа №9 Тема: «Вычисление значения таблично заданной функции с использованием алгоритма интерполирования по Ньютону»
Размер42.04 Kb.
ТипЛабораторная работа



«Численные Методы в Механике»

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

Тема: «Вычисление значения таблично заданной функции с использованием алгоритма интерполирования по Ньютону»

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

При этом функцию называют интерполяционным многочленом, а точки узлами интерполяции.

Постановка задачи

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

.

(Фрагмент таблицы данных)

Шаг изменения аргумента для данной таблицы является величиной постоянной.

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

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

, (9.1)

. (9.2)

Выбор одной из двух представленных выше формул для конкретного вычисления должен базироваться на следующих рассуждениях. Заданное пользователем значение аргумента обязательно должно удовлетворять условию . Следовательно, всегда найдется такая пара соседних узлов интерполирования, для которой будет иметь место двойное неравенство . Если при этом значение индекса окажется меньше чем , то будем применять первую интерполяционную формулу, т.е. (11.1). Если же , то применяем вторую формулу – (11.2), где . Такой подход обеспечит нам максимальную точность вычислений в рамках интерполирования по Ньютону с конечными разностями до 6-го порядка включительно, т.е. для .

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

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

  1. определения количества записей (пар чисел ) в файле данных:

  2. выделения памяти под массивы аргумента и функции соответствующей размерности;

  3. считывания данных из файла в подготовленные массивы;

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

Очевидно, что последний этап не должен изменять сами пары чисел .

Исходные данные размещены в файлах LabTask_09_01.txt – LabTask_09_20.txt, где последние две цифры указывают на номер Вашего варианта.

Эти файлы генерируются уже известной Вам программой NMM_Labs и размещаются в директории (папке), откуда программа NMM_Labs загружается Вами на выполнение.

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

^ Требования к программным компонентам

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

Результаты выполнения программы должны сохраняться в последовательных текстовых файлах. Эти файлы должны обязательно включать: упорядоченную таблицу исходных данных, таблицу конечных разностей и значения для заданных пользователем значений с указанием формулы (11.1) или (11.2), по которой производилось это вычисление. Последний файл создается с именем RezTask_09_00.txt , где последние две цифры должны соответствовать Вашему варианту задания.

Задание может быть оформлено в виде одной программной единицы – основной функции.

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

Пусть уже имеется текстовый файл LabTask_09_00.txt с числовыми данными.

Стартуем среду разработки MS Visual Studio. Создадим новый проект LabTask_09f и сгенерируем в нем файл основной программной единицы – main_09.f90. Скопируем файл LabTask_09_00.txt в директорию проекта LabTask_09f и включим его в проект:



Мы видим, что файл LabTask_09_00.txt содержит неупорядоченные данные.

Выполним поэтапное проектирование нашего задания. На первом этапе составим алгоритм чтения файла данных и выяснения количества записей в этом файле.



В данном фрагменте реализовано чтение из файла записей фиксированной длины по определенному формату. Визуальный анализ структуры данных файла LabTask_09_00.txt показывает, что на каждое из двух чисел, размещенных в одной строке (в одной записи файла), выделено всего по 20 позиций, из которых 14 отведено под цифры числа после десятичной точки. Сказанное объясняет синтаксис оператора format(2f20.14), записанного в строке 13 данного кода.

Выполнение цикла do while(.not.eof(1)) прекратится, когда встроенная функция eof() возвратит значение true, т.е. когда будет достигнут конец читаемого файла.

Выполнение данного кода дает:



Результат соответствует содержимому файла LabTask_09_00.txt, поэтому мы можем теперь переходить к следующим этапам проектирования программы:

  • выделения памяти под массивы аргумента и функции соответствующей размерности;

  • считывания данных из файла в подготовленные массивы;

  • сортировки массивов по возрастанию аргумента.

Операторы описания типа будут следующими:





Оператор rewind(1) (строка 14) позиционирует файл с номером 1 в начало его первой записи.

После того, как массивы данных сформированы, необходимо выполнить их сортировку.

В качестве алгоритма сортировки выберем принцип «воздушного пузырька», всплывающего в «тяжелой» жидкости под действием Архимедовой силы, см. строки кода 22–29.

Следуя такому принципу, нам предстоит упорядочить n+1 пару чисел с «номерами» от 0 до n.

Будем производить сравнение между двумя смежными элементами ( и ) массива x, начиная от последнего () и двигаясь к первому элементу () этого массива.

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

Всего таких «проходов» необходимо выполнить n раз, выполняя сравнения и перестановки элементов массива, начиная от последнего и заканчивая элементом, индекс j которого равен порядковому номеру i «прохода».

Очевидно, что упорядочивание массива x должно сопровождаться соответствующими перестановками элементов массива y.

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

Результат сортировки массивов x и y сохраним (30–34) в текстовом файле sort.txt в том же формате данных, что и в исходном файле (для удобства их визуального сопоставления). Файл sort.txt включим в проект LabTask_09f.



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

Для таблицы разностей сформируем отдельный двумерный динамический массив table(0:n,0:6), нулевой столбец которого содержит упорядоченные значения .

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

Заполненную таблицу разностей запишем в «свой» текстовый файл – table.txt.

0 2.43973721 -0.70685700 -0.23437559 0.23510511 -0.00052944 -0.05741317 0.01418656

1 1.73288021 -0.94123259 0.00072952 0.23457567 -0.05794260 -0.04322661 0.02476968

2 0.79164763 -0.94050307 0.23530519 0.17663307 -0.10116921 -0.01845692 0.02928836

3 -0.14885544 -0.70519787 0.41193826 0.07546386 -0.11962613 0.01083144 0.02663627

4 -0.85405331 -0.29325961 0.48740212 -0.04416227 -0.10879469 0.03746772 0.01746273

5 -1.14731292 0.19414251 0.44323985 -0.15295696 -0.07132698 0.05493045 0.00401374

6 -0.95317040 0.63738236 0.29028289 -0.22428394 -0.01639653 0.05894419 -0.01041793

7 -0.31578804 0.92766525 0.06599895 -0.24068047 0.04254766 0.04852625 -0.02229890

8 0.61187721 0.99366420 -0.17468152 -0.19813281 0.09107391 0.02622735 -0.02872030

9 1.60554141 0.81898267 -0.37281434 -0.10705890 0.11730126 -0.00249295 -0.02810995

10 2.42452408 0.44616834 -0.47987324 0.01024236 0.11480831 -0.03060291 -0.02061729

11 2.87069242 -0.03370490 -0.46963088 0.12505067 0.08420540 -0.05122020 -0.00807679

12 2.83698752 -0.50333578 -0.34458021 0.20925607 0.03298520 -0.05929699 0.00644120

13 2.33365174 -0.84791599 -0.13532414 0.24224126 -0.02631179 -0.05285579 0.01938217

14 1.48573575 -0.98324013 0.10691712 0.21592947 -0.07916758 -0.03347361 0.02757772

15 0.50249561 -0.87632302 0.32284659 0.13676189 -0.11264119 -0.00589590 0.00000000

16 -0.37382740 -0.55347643 0.45960848 0.02412070 -0.11853709 0.00000000 0.00000000

17 -0.92730383 -0.09386795 0.48372918 -0.09441639 0.00000000 0.00000000 0.00000000

18 -1.02117178 0.38986123 0.38931278 0.00000000 0.00000000 0.00000000 0.00000000

19 -0.63131055 0.77917401 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000

20 0.14786346 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000

Код, обеспечивающий расчет таблицы конечных разностей и вывод ее в файл table.txt:





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

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



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



Строки кода ^ 55-58 предназначены для определения индекса m подинтервала, в который «попало» заданное пользователем значение аргумента rx. Если этот подинтервал принадлежит верхней части таблицы данных – то будем применять первую интерполяционную формулу Ньютона (62–66), в противном случае – вторую интерполяционную формулу (68-72).

Вам необходимо самостоятельно изучить программную реализацию вычислений, выполняемых в соответствии с формулами интерполирования (9.1) и (9.2).

Вывод результатов будем производить как на монитор компьютера (74), так и в тестовый файл RezTask_09_00.txt, см. строки кода (66,72).

Запустим программу на выполнение и осуществим вычисления для некоторого количества входных данных, например:



Завершение работы программы выполним нажатием сочетания клавиш Ctrl+C.

Файл результатов работы, также включенный нами в проект, будет иметь вид:



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

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

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

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

После инициализации проекта LabTask_09с зададим новое имя файлу ProgramProgram_09.

Скопируем файл данных LabTask_09_00.txt в директорию проекта LabTask_09с.



Включим файл в LabTask_09_00.txt проект LabTask_09с и зададим значение «Copy always» для свойства «Copy to Output Directory» этого файла:



Это действие позволит среде разработки автоматически учитывать изменения, производимые пользователем с файлом LabTask_09_00.txt, при загрузке данной программы на выполнение.

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

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

Никаких принципиально новых элементов программирования на C# мы здесь не применяем, поэтому код программы приводится без комментариев. Вам следует самостоятельно разобраться в функциональном предназначении блоков программы.



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

Например, в качестве первого этапа можно принять этап, завершающийся формированием файла sort.txt. Если выполнение программы завершается успешно – файл sort.txt создается и его содержимое эквивалентно данным из аналогичного файла sort.txt предыдущего проекта, то можно переходить к программированию следующего этапа и т.д.



Следите за соблюдением форматов ввода–вывода. Чтение первичных данных из файла LabTask_09_00.txt, выполняемое в строках 50–51, производится с учетом того, что общее количество символов (включая пробелы), отведенное на каждое из чисел в строке, равно 20.

Поскольку нумерация символов в строке начинается от 0, то первое число, т.е. – размещено в символах от 0-го до 19-го, а второе число, т.е. – от 20-го до 39-го.

Внимательно изучите форматы данных в вашем варианте файла LabTask_09_№№.txt.

Особое внимание следует уделить синтаксису циклов с отрицательным шагом переменной цикла. Сравните, например, строку ^ 56 данного кода и строку 23 программы на Fortran.



Рассчитанная таблица разностей оказывается идентичной таковой из предыдущего проекта:

0 2,43973721 -0,70685700 -0,23437559 0,23510511 -0,00052944 -0,05741317 0,01418656

1 1,73288021 -0,94123259 0,00072952 0,23457567 -0,05794260 -0,04322661 0,02476968

2 0,79164763 -0,94050307 0,23530519 0,17663307 -0,10116921 -0,01845692 0,02928836

3 -0,14885544 -0,70519787 0,41193826 0,07546386 -0,11962613 0,01083144 0,02663627

4 -0,85405331 -0,29325961 0,48740212 -0,04416227 -0,10879469 0,03746772 0,01746273

5 -1,14731292 0,19414251 0,44323985 -0,15295696 -0,07132698 0,05493045 0,00401374

6 -0,95317040 0,63738236 0,29028289 -0,22428394 -0,01639653 0,05894419 -0,01041793

7 -0,31578804 0,92766525 0,06599895 -0,24068047 0,04254766 0,04852625 -0,02229890

8 0,61187721 0,99366420 -0,17468152 -0,19813281 0,09107391 0,02622735 -0,02872030

9 1,60554141 0,81898267 -0,37281434 -0,10705890 0,11730126 -0,00249295 -0,02810995

10 2,42452408 0,44616834 -0,47987324 0,01024236 0,11480831 -0,03060291 -0,02061729

11 2,87069242 -0,03370490 -0,46963088 0,12505067 0,08420540 -0,05122020 -0,00807679

12 2,83698752 -0,50333578 -0,34458021 0,20925607 0,03298520 -0,05929699 0,00644120

13 2,33365174 -0,84791599 -0,13532414 0,24224126 -0,02631179 -0,05285579 0,01938217

14 1,48573575 -0,98324013 0,10691712 0,21592947 -0,07916758 -0,03347361 0,02757772

15 0,50249561 -0,87632302 0,32284659 0,13676189 -0,11264119 -0,00589590 0,00000000

16 -0,37382740 -0,55347643 0,45960848 0,02412070 -0,11853709 0,00000000 0,00000000

17 -0,92730383 -0,09386795 0,48372918 -0,09441639 0,00000000 0,00000000 0,00000000

18 -1,02117178 0,38986123 0,38931278 0,00000000 0,00000000 0,00000000 0,00000000

19 -0,63131055 0,77917401 0,00000000 0,00000000 0,00000000 0,00000000 0,00000000

20 0,14786346 0,00000000 0,00000000 0,00000000 0,00000000 0,00000000 0,00000000

Отличие заключается лишь в том, что в текстовых файлах разделителем целой и дробной частей десятичного числа в ^ Fortran всегда является точка, а в C# – это символ, принятый ОС для данного компьютера (в данном случае это оказалась запятая).



Для корректного завершения данного консольного приложения реализован выход «по условию», см. строку ^ 116. В том случае, если пользователь введет в качестве аргумента значение, выходящее за пределы интервала интерполирования, переменная flag получит значение false и программа «выйдет» из цикла while(flag) {…}.

В этом случае файл RezTask_09_00.txt результатов будет сохранен в директории данного проекта. В противном случае – когда завершение программы будет принудительным, например, через Ctrl+C, данные для файла RezTask_09_00.txt будут утеряны.


После компиляции проекта выполним ввод данных, идентично тому, как это делалось в предыдущем проекте:



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



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

Разработанное консольное приложение можно квалифицировать как «Калькулятор неизвестной функции», поскольку нам неизвестен функциональный вид той зависимости, по таблице которой мы программным путем строили интерполяционный многочлен, а затем использовали этот полином для вычислений.

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

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

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



Работа данной формы начинается после нажатия на кнопку «^ Генерировать файл данных».



В результате в директории, из которой была отправлена на выполнение программа NMM_Labs.ехе, появится (или обновится) текстовый файл данных LabTask_09_№№.txt. Этот файл Вам необходимо будет также скопировать в рабочие директории проектов Вашей лабораторной работы на Fortran и C# (при условии совпадения номеров вариантов).

Имя указанного файла появится на форме, а сами данные будут выведены на форму в соответствующей таблице – «^ Таблице исходных данных».

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

Для старшего порядка конечных разностей установлен диапазон от 2 до 6.

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



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

Последним действием, доступным для Вас в рамках программы NMМ_Labs, является ввод значения аргумента, для которого требуется вычислить значение интерполяционного многочлена Ньютона для данного старшего порядка конечных разностей. При этом информация о выборе интерполяционной формулы и данные, участвующие в вычислениях, будут выводиться на форму.

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

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




В случае совпадения результатов, получаемых для различных значений аргумента при помощи Ваших программ (на Fortran и C#) и программы NMМ_Labs, считается, что лабораторная работа № 9 Вами выполнена успешно.

Составитель – ст. преп. Царенко А.П. 6 июля 2013 г.

Похожие:

Лабораторная работа №9 Тема: «Вычисление значения таблично заданной функции с использованием алгоритма интерполирования по Ньютону» iconЛабораторная работа №9 Тема: «Вычисление значения таблично заданной функции с использованием алгоритма интерполирования по Ньютону»
Напомним, что задача интерполирования заключается в построении для табличной функции некоторой приближающей функции, аналитическим...
Лабораторная работа №9 Тема: «Вычисление значения таблично заданной функции с использованием алгоритма интерполирования по Ньютону» iconЛабораторная работа №10 Тема: «Исследование на экстремум таблично заданной функции с использованием интерполирования сплайнами»
Напомним, что сплайн – это функция, которая на каждом частичном отрезке интерполяции является алгебраическим многочленом, а на всем...
Лабораторная работа №9 Тема: «Вычисление значения таблично заданной функции с использованием алгоритма интерполирования по Ньютону» iconЛабораторная работа №11 Тема: «Приближенное вычисление производной от таблично заданной функции на основе интерполяционных многочленов Лагранжа и Ньютона»
Пусть исследуемая функция либо задана таблично на интервале с постоянным шагом, либо имеет достаточно сложный функциональный вид,...
Лабораторная работа №9 Тема: «Вычисление значения таблично заданной функции с использованием алгоритма интерполирования по Ньютону» iconЛабораторная работа №8 Тема: «Уплотнение таблицы функции с использованием интерполяционного многочлена Лагранжа»
Интерполирование может применяться для уплотнения заданной таблицы функции, т е вычисления по исходной таблице функции ее новой таблицы,...
Лабораторная работа №9 Тема: «Вычисление значения таблично заданной функции с использованием алгоритма интерполирования по Ньютону» iconЛабораторная работа №2 Таблицы, сортировка таблиц, вычисление в таблицах
Создайте журнал (таблицу) учета текущей успеваемости студентов вашей подгруппы по информатике в сентябре и октябре месяцах, следующего...
Лабораторная работа №9 Тема: «Вычисление значения таблично заданной функции с использованием алгоритма интерполирования по Ньютону» icon1. Понятие функции одной переменной
Рассмотрим два числовых множества X и Y. Правило f, по которому каждому числу ХI х ставится в соответствие единственное число yi...
Лабораторная работа №9 Тема: «Вычисление значения таблично заданной функции с использованием алгоритма интерполирования по Ньютону» iconЛабораторная работа №29 Тема: Зачетная работа по теме: «Учет с подотчетными лицами»

Лабораторная работа №9 Тема: «Вычисление значения таблично заданной функции с использованием алгоритма интерполирования по Ньютону» iconЛабораторная работа №1. Задачи на многопоточность
Решить задачу на многопоточность с использованием библиотеки java util. Concurrent
Лабораторная работа №9 Тема: «Вычисление значения таблично заданной функции с использованием алгоритма интерполирования по Ньютону» iconЛабораторная работа №6-1 Тема: Работа над созданием презентации программы Microsoft Power Point
Распечатываю рамку стандартного образца где вместо названия документа впечатываю Ф. И. О
Лабораторная работа №9 Тема: «Вычисление значения таблично заданной функции с использованием алгоритма интерполирования по Ньютону» iconЛабораторная работа №1 Тема : «Отладчик debug»
Краткая аннотация: данная работа посвящена знакомству с отладчиком debug, который позволяет
Лабораторная работа №9 Тема: «Вычисление значения таблично заданной функции с использованием алгоритма интерполирования по Ньютону» iconЛабораторная работа № Экспериментальное определение нормальных и касательных напряжений при изгибе
Ознакомление с тензометрическим методом определения напряжений с использованием тензорезисторов
Вы можете разместить ссылку на наш сайт:
Документы


При копировании материала укажите ссылку ©ignorik.ru 2015

контакты
Документы