![](/user_photo/2706_HbeT2.jpg)
учебное пособие по лр_фортран
.pdf82
Содержание отчета
1.Название работы и номер варианта индивидуального задания.
2.Фамилия, имя, отчество и номер группы студента.
3.Текст варианта индивидуального задания.
4.Постановка задачи, методы вычислений.
5.Графическая интерпретация (если требуется), выполненная вручную или пакетом Agrapher.
6.Блок-схемы главной программы и подпрограмм.
7.Распечатка текстов главной программы и подпрограмм.
8.Распечатка файла результатов Out.txt.
При подготовке к защите ответить на контрольные вопросы.
Справочная информация
Встроенные функции по линейной алгебре смотрите в разделе 6.3.
Комментарии к заданию
1.Проект должен состоять из независимых программных единиц – главной программы и подпрограмм, каждая с собственной системой обозначений объектов.
2.Правила применения каждой подпрограммы должны быть описаны в вызывающей программе в операторе Interface.
3.Подпрограмма Subroutine – процедура, вызываемая оператором
Call имя_подпрограммы(аргументы).
4.Для передачи данных используются аргументы – фактические в главной программе и формальные в подпрограмме.
5.Результаты подпрограммы передаются в вызывающую программу через выходные аргументы (атрибут Intent(Out)) и не связаны с именем подпрограммы. Количество выходных аргументов может быть любым, в том числе ни одного.
6.Если все фактические аргументы позиционные (без ключевых слов), то количество фактических и формальных аргументов должно совпадать. Кроме того, в этом случае попарно в порядке следования фактические и формальные аргументы должны соответствовать по типу, назначению и форме. Совпадение имен фактических и формальных аргументов не требуется, но и не запрещается.
7.Атрибут назначения каждого формального аргумента (Intent) должен быть описан.
Пример
В подпрограмме: найти номер и значение максимального по модулю элемента одномерного массива.
Практикум по современному Фортрану
83
В главной программе: используя подпрограмму, найти для нескольких массивов разной длины номера и значения элементов, максимальных по модулю.
Программа
Далее приведена главная программа, в составе которой показаны интерфейс и вызовы подпрограммы.
Program Sub1 ! ФИО Лаб10 Группа. Вар.
Implicit none
Interface ! шаблон вызываемой подпрограммы
Subroutine MaxAbs(Mas, eLem, Num)
Implicit none
Real,intent(in),dimension(:)::Mas ! входной массив
Real,intent(out)::eLem ! выходной: max по модулю элемент Integer,intent(out)::Num ! выходной: номер max по модулю
End Subroutine MaxAbs
End Interface Real,dimension(1:12)::B Real,dimension(1:10)::C
Real MaxB, MaxC |
! max по модулю элементы для В,C |
|
Integer NumB, NumC ! и их порядковые номера в массивах |
||
... |
! ввод и вывод в результирующий файл массива B |
|
Call MaxAbs(B, MaxB, NumB) |
||
... |
! вывод в результирующий файл NumB, MaxB |
|
... |
! ввод и вывод в результирующий файл массива C |
|
Call MaxAbs(C, MaxC, NumC) |
||
... |
! вывод в результирующий файл NumC, MaxC |
End Program Sub1
Результаты работы программы Sub1
Массив В |
-4.0 |
6.0 |
20.0 |
45.0 |
-71.0 |
1.0 |
|||||
4.0 |
-17.0 |
.0 |
.0 |
.0 |
11.0 |
max по модулю элемент |
-71.0 его номер |
6 в массиве B |
|||
Массив С |
.0 |
45.0 |
71.0 |
4.0 |
-17.0 |
-122.0 |
|||||
.0 |
.0 |
.0 |
11.0 |
|
1 в массиве C |
max по модулю элемент |
-122.0 его номер |
Контрольные вопросы к защите работы
1.Назовите четыре вида программных единиц в Фортране.
2.Что называют процедурой в программировании? Сколько видов процедур в Фортане?
3.Что такое внешняя программная единица и внутренняя процедура?
Каков механизм присоединения данных носителя? Приведите примеры.
Практикум по современному Фортрану
84
4.Оформите как процедуру вычисление количества повторений цикла
изначения переменной цикла при нормальном завершении цикла.
5.Зачем процедуре имя? Есть ли ответ, связанный с именем процедуры? Как передаются результаты подпрограммы в вызывающую программу?
6.Что такое формальные и фактические аргументы? Правила согласования формальных и фактических аргументов, поясните примерами.
7.Какими по назначению могут быть формальные аргументы процедуры, приведите примеры описания назначения формальных аргументов.
8.Где и для чего пишут интерфейсы? Когда интерфейс обязателен?
9.Одинаковые по порядку аргументы должны ли иметь одинаковые имена:
−в интерфейсе,
−в вызывающей программе,
−в вызываемой процедуре.
10.Надо ли оператор Implicit none писать везде:
−в интерфейсе,
−в вызывающей программе,
−в вызываемой процедуре.
11.Чем подпрограмма отличается от функции? Сравните на примере, оформив как функцию и как подпрограмму вычисление количества повторений цикла.
Пример контрольного задания
1.В подпрограмме: используя циклы, вычислить три суммы элементов квадратной вещественной матрицы, расположенных a) ниже, b) выше, c) на главной диагонали. В главной программе: приме-
нить подпрограмму к матрице размером 8×8. Вывести три значащих цифры результатов. Блок-схема подпрограммы обязательна.
2.Напишите интерфейс подпрограммы Radius для нахождения радиуса и длины окружности, которая проходит через три точки, заданные своими координатами. Покажите, как применить подпро-
грамму к трем точкам: A (3.7, 6.1), В (12.6, 2.11) и С (11.5, 8.2).
Практикум по современному Фортрану
![](/html/2706/248/html_eGVwHe0umu.cz9p/htmlconvd-Ww6gfr84x1.jpg)
85
Варианты индивидуальных заданий
Вариант 1
В подпрограмме: методом парабол (Симпсона) вычислить определен-
ный интеграл функции f(x) на интервале [a, b] с абсолютной погрешно-
стью ε. Первоначально разбить интервал на 10 участков. На каждой следующей итерации удваивать количество участков. Вычисления прекратить, когда результат интегрирования будет отличаться от предыду-
щего не более чем на ε. Выходные аргументы – значение интеграла и количество итераций, потребовавшихся для достижения точности.
b dx
В главной программе: Применив подпрограмму, вычислить ∫a sin2 x на
интервале [1.5, 2.5] с точностью ε = 10-2 и ε = 10-4. Сравнить полученные значения с интегралом, вычисленным по первообразной функции и средствами пакета Agrapher.
Вариант 2
Вподпрограмме: перемножить две матрицы. Логический выходной аргумент равен . false., если матрицы невозможно перемножить из-за несоответствия их размеров (иначе . true.).
Вглавной программе: на примере трех матриц A, B и C показать, что (A+B)C= AC+ BC. Размеры матриц (не квадратных) выберите сами. Работу подпрограммы проверить, вызвав функцию Matmul.
После обращения к каждой подпрограмме выводить сформированную матрицу или аварийное сообщение о невозможности получения результата. После аварийного сообщения завершить программу.
Вариант 3
В подпрограмме: вычислить математическое ожидание и дисперсию случайной величины, значения которой находятся в одномерном массиве. Примечание: для равномерно распределенной случайной величины математическое ожидание и дисперсия вычисляются по формулам
|
n |
|
n |
|
|
∑xi |
D(x) = |
∑[xi − M (x)]2 |
|
M (x) = |
i =1 |
i =1 |
||
|
||||
n |
n |
|||
|
|
В главной программе: с помощью генератора псевдослучайных чисел RANDOM_NUMBER создать два одинаковых по длине одномерных массива X и Y, значения которых находятся в интервале [0; 10].
Используя подпрограмму, на примере этих массивов показать, что
M(X+Y) = M(X) +M(Y) и D(X+Y) D(X) + D(Y). После каждого обраще-
ния к подпрограмме выводить результаты с пояснениями.
Практикум по современному Фортрану
![](/html/2706/248/html_eGVwHe0umu.cz9p/htmlconvd-Ww6gfr85x1.jpg)
86
Вариант 4
Вподпрограмме 1: определить количество и составить массив простых чисел в интервале [1; N], используя определение простых чисел.
Вподпрограмме 2: определить количество и составить массив простых чисел в интервале [1; N], используя алгоритм «Решето Эратосфена».
Вглавной программе: последовательно применив обе подпрограммы, найти простые числа среди первых 200 чисел натурального ряда. Сравнить результаты применения подпрограмм.
Вариант 5
Вподпрограмме: по значениям трех коэффициентов квадратного уравнения найти его корни (действительные или комплексные). Логический выходной аргумент равен .true., если корни действительные (.false., если нет действительных корней).
Вглавной программе: используя подпрограмму, найти корни 10 уравнений, коэффициенты которых расположены в двумерном массиве раз-
мером 3×10 (каждому уравнению соответствует столбец массива). Результаты оформить в виде таблицы.
Вариант 6
В подпрограмме: методом половинного деления вычислить действитель-
ный корень уравнения y = sin(0.9x) – (x – 0.4)2 + 3.1 в интервале
[a, b] с абсолютной погрешностью ε. Логический выходной аргумент равен .true., если в этом интервале существует единственный корень (.false., если корень не единственный, или в интервале корней нет).
Впакете Agrapher построить график функции и определить интервалы нахождения корней.
Вглавной программе: применить подпрограмму к каждому из найден-
ных интервалов при ε =10-2 и ε =10-4. Проверить решение, подставив корни в уравнение. В отчете представить график функции.
Вариант 7
Вподпрограмме: умножить матрицу на вектор. Логический выходной аргумент равен . false., если умножение матрицы на вектор невозможно из-за несоответствия их размеров (иначе . true.).
Вглавной программе: на примере двух матриц A и B и вектора V показать, что (A+B)V = AV+ BV. Размеры матриц и вектора выберите сами. Работу подпрограммы проверить, вызвав функцию Matmul.
После каждого обращения к подпрограмме выводить сформированный вектор или аварийное сообщение о невозможности получения результата. После аварийного сообщения завершить программу.
Практикум по современному Фортрану
![](/html/2706/248/html_eGVwHe0umu.cz9p/htmlconvd-Ww6gfr86x1.jpg)
87
Вариант 8
В подпрограмме: методом трапеций вычислить определенный инте-
грал функции f(x) на интервале [a, b] с абсолютной погрешностью ε. Первоначально разбить интервал на 10 участков. На каждой следующей итерации увеличивать количество участков на 50%. Вычисления прекратить, когда результат интегрирования будет отличаться от предыду-
щего не более чем на ε. Выходные аргументы – значение интеграла и количество итераций, потребовавшихся для достижения точности.
В главной программе: Применив |
подпрограмму, |
вычислить |
∫b (2x4 − x2 +1)dx на интервале [–1, 1.4] с точностью ε = 10-2 |
и ε = 10-4. |
|
a |
|
|
Сравнить полученные значения с интегралом, вычисленным по первообразной функции и средствами пакета Agrapher.
Вариант 9
Вподпрограмме: координаты седловых элементов матрицы записать в двумерный массив размером 2×N, в котором N – количество седловых элементов, а каждому седловому элементу соответствует столбец.
Седловым считать элемент матрицы, значение которого строго меньше его «соседей» по горизонтали и строго больше «соседей» по вертикали. Учесть, что количество «соседей» элемента матрицы в зависимости от его положения колеблется от 2 до 4.
Вглавной программе: воспользоваться подпрограммой для двух матриц, для каждой вывести таблицу с координатами седловых элементов и их значениями.
Вариант 10
Вподпрограмме 1: транспонировать матрицу (m ≠ n).
Вподпрограмме 2: перемножить две матрицы (m ≠ n).
Вобеих подпрограммах: матрицы не обязательно квадратные; логический выходной аргумент равен . false., если выполнение действий невозможно из-за несоответствия размеров матриц (иначе . true.).
Вглавной программе: используя подпрограммы, на примере двух квадратных матриц A и B показать, что (AB)T = ATBT. Размеры матриц n×n выберите сами.
Работу подпрограммы 1 проверить, вызвав функцию Transpose, подпрограммы 2 – функцию Matmul.
После обращения к каждой подпрограмме выводить сформированную матрицу или аварийное сообщение о невозможности получения результата. После аварийного сообщения завершить программу.
Практикум по современному Фортрану
![](/html/2706/248/html_eGVwHe0umu.cz9p/htmlconvd-Ww6gfr87x1.jpg)
88
Вариант 11
В подпрограмме: по таблице значений f(x) вычислить ∫b f (x)dx методом
a
трапеций.
В главной программе: составить таблицы значений f (x) = x2e0.2x в интервале [a, b] = [0.3, 1.7] с шагом n1 = 0,1 и n2 = 0,02. Применив подпрограмму, вычислить величину интеграла. Сравнить полученные значения с интегралом, вычисленным по первообразной функции и средствами пакета Agrapher.
Вариант 12
В подпрограмме 1: вычислить С – скалярное (внутреннее) произведение
двух векторов C = ∑Ai Bi . Логический выходной аргумент равен . false.,
i
если перемножить векторы невозможно из-за несоответствия их размеров (.true., если перемножение векторов возможно).
В подпрограмме 2: вычислить матрицу M – внешнее произведение двух векторов, элементы которой вычисляются по формуле: Mi,k=AiBk.
В главной программе: применить подпрограммы к двум векторам. Для проверки подпрограммы 1 вызвать функцию Dot_product, подпрограммы 2 – функцию Matmul.
После обращения к каждой подпрограмме выводить результат умножения или аварийное сообщение о невозможности его получения. После аварийного сообщения завершить программу.
Вариант 13
В подпрограмме: методом прямоугольников вычислить определенный
интеграл функции f(x) на интервале [a,b] с абсолютной погрешностью ε. Первоначально разбить интервал на 10 участков. На каждой следующей итерации увеличивать количество участков на 50%. Вычисления прекратить, когда результат интегрирования будет отличаться от предыду-
щего не более чем на ε. Выходные аргументы – значение интеграла и количество итераций, потребовавшихся для достижения точности.
В главной программе: Применив |
подпрограмму, |
вычислить |
∫b (2x3 −3x +4)dx на интервале [–1.5, 1.5] с точностью ε= 10-2 и ε= 10-4.
a
Сравнить полученные значения с интегралом, вычисленным по первообразной функции и средствами пакета Agrapher.
Практикум по современному Фортрану
![](/html/2706/248/html_eGVwHe0umu.cz9p/htmlconvd-Ww6gfr88x1.jpg)
89
Вариант 14
В подпрограмме: сформировать матрицу B(m,n) в соответствии с исход-
|
|
|
|
n |
|
−ai j |
|
|
|
|
|
∑aik |
|||
ной матрицей A(m,n) по правилу |
b |
= |
k =1 |
|
|
|
|
|
|
. |
|||||
i j |
|
|
m |
||||
|
|
|
|
∑ak j |
−ai j |
||
|
|
|
k =1 |
|
|
|
В главной программе: применить подпрограмму к двум матрицам разных размеров. Вывести исходные и результирующие матрицы.
Вариант 15
В подпрограмме: по таблицам значений f(x) вычислить ∫b f (x)dx мето-
a
дом прямоугольников.
В главной программе: составить таблицы значений f (x) = x2 sin x в интервале [a, b] = [1.5, 3] с шагом n1 = 0,1 и n2 = 0,01. Применив подпрограмму, вычислить величину интеграла. Сравнить полученные значения с интегралом, вычисленным по первообразной функции и средствами пакета Agrapher.
Вариант 16
В подпрограмме: вычислить длины сторон, периметр и площадь выпуклого многоугольника по координатам его вершин. Координаты вершин расположены в двумерном массиве размером 2×N, в котором N – количество вершин, а каждой вершине соответствует столбец.
В главной программе: последовательно читая из файла координаты вершин треугольника, четырехугольника, пятиугольника и применяя к ним подпрограмму, составить таблицу (длины сторон, периметр и площадь). В отчете привести графическую интерпретацию.
Вариант 17
Вподпрограмме 1: отсортировать одномерный массив по убыванию любым способом.
Вподпрограмме 2: объединить два отсортированных по убыванию массива, не нарушив сортировки.
Вглавной программе: с помощью генератора псевдослучайных чисел RANDOM_NUMBER создать два одномерных массива разной длины со значениями в интервале [0; 100]. Отсортировать эти массивы по убыванию (подпрограмма 1). Вывести массивы до и после сортировки. Объединить массивы (подпрограмма 2). Вывести объединенный массив.
Практикум по современному Фортрану
![](/html/2706/248/html_eGVwHe0umu.cz9p/htmlconvd-Ww6gfr89x1.jpg)
90
Вариант 18
В подпрограмме: преобразовать матрицу, заменив каждый отрицательный элемент матрицы средним арифметическим его «соседей» по горизонтали и по вертикали при условии, что все «соседи» неотрицательны. Учесть, что количество «соседей» элемента колеблется от 2 до 4 в зависимости от его положения в матрице.
Координаты замененных элементов матрицы записать в двумерный массив размером 2×N, в котором N – количество элементов, а каждому элементу матрицы соответствует столбец.
В главной программе: воспользоваться подпрограммой для двух матриц разных размеров, для каждой вывести измененную матрицу и координаты замененных элементов.
Вариант 19
Вподпрограмме: реализовать циклический сдвиг матрицы на n элементов вправо, влево, вверх или вниз в зависимости от заданного режима. Значение n может превышать размер матрицы по любому измерению.
Вглавной программе: ввести матрицу и многократно сдвигать ее, используя подпрограмму. Направление и величину сдвига задавать в диалоге. После сдвига выводить его направление и величину и полученную в результате матрицу. Работу программы прекратить после ввода слова,
отличного от слов Up, Down, Left, Right (например, Stop).
Вариант 20
Вподпрограмме 1: определить количество и составить массив простых чисел в интервале [1, N], используя определение простых чисел.
Вподпрограмме 2: определить количество и составить массив простых чисел в интервале [1, N], используя алгоритм «Решето Сундарама».
Вглавной программе: последовательно применив обе подпрограммы, найти простые числа среди первых 200 чисел натурального ряда. Сравнить результаты применения подпрограмм.
Вариант 21
Вподпрограмме: решить систему линейных уравнений AX = B методом Гаусса. Здесь A – матрица коэффициентов уравнения, B – вектор свободных членов, X – вектор корней системы.
Логический выходной аргумент равен .true., если система имеет решение, и притом единственное (иначе . false.).
Вглавной программе: применить подпрограмму к двум системам из пяти и шести линейных уравнений. Применить функцию Matmul к матрице A и вектору X и сравнить полученный вектор с вектором B.
Практикум по современному Фортрану
![](/html/2706/248/html_eGVwHe0umu.cz9p/htmlconvd-Ww6gfr90x1.jpg)
91
Вариант 22
Вподпрограмме 1: отсортировать одномерный массив по убыванию методом последовательного нахождения минимального элемента массива
иперестановки его в начало массива.
Вподпрограмме 2: отсортировать одномерный массив по убыванию методом «пузырька».
Вкаждой подпрограмме: подсчитать количество перестановок элементов при сортировке.
Вглавной программе: с помощью генератора псевдослучайных чисел RANDOM_NUMBER создать одномерный массив, значения которого находятся в интервале [0; 10]. Обратившись к подпрограммам, отсортировать этот массив по убыванию. Вывести массив до и после сортировки. Сравнить полученные массивы и количества перестановок.
Вариант 23
В подпрограмме: Найти координаты точек, в которых прямая, заданная уравнением kx+b, пересекает стороны треугольника; координаты вер-
шин треугольника расположены в двумерном массиве размером 2×3 (каждой вершине соответствует столбец массива).
Логический выходной аргумент равен .true., если прямая пересекает треугольник (иначе .false.)
Вглавной программе: ввести коэффициенты уравнений пяти прямых и координаты вершин треугольника. Применив подпрограмму к каждой из прямых, составить таблицу (коэффициенты уравнений, координаты точек их пересечения со сторонами треугольника).
Вотчете привести графическую интерпретацию.
Вариант 24
В подпрограмме: методом половинного деления вычислить действитель-
ный корень уравнения y = (x – 0.6)3 – (x + 4)2 + x + 26.8 в интер-
вале [a, b] с абсолютной погрешностью ε. Логический выходной аргумент равен .true., если в этом интервале существует единственный корень (иначе . false.).
Впакете Agrapher построить график функции и определить интервалы нахождения корней.
Вглавной программе: применить подпрограмму к каждому из найден-
ных интервалов при ε =10-3 и ε =10-5. Проверить решение, подставив корни в уравнение. В отчете представить график функции.
Практикум по современному Фортрану