Требования к программным компонентам
Основная программа должна быть построена таким образом, чтобы пользователь мог задавать значение аргумента непосредственно во время ее выполнения.
Результаты выполнения программы должны сохраняться в последовательных текстовых файлах. Эти файлы должны обязательно включать: упорядоченную таблицу исходных данных, таблицу конечных разностей и значения для заданных пользователем значений с указанием формулы (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.
Очевидно, что произвести сравнительный анализ значений функции, полученных путем интерполирования, с точными значениями функции не представляется возможным, поскольку исходные данные были заданы не функционально, а в виде таблицы дискретных значений.