Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
NMM_Manual_N09.doc
Скачиваний:
9
Добавлен:
27.10.2018
Размер:
730.11 Кб
Скачать

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

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

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]