Текст программы
LAB3B, EPS, H, S, X, X0, XK, YI, N(1, FILE='LAB3.TXT')=0.1; XK=1.; EPS=0.0001=(XK-X0)/10.I=0,10=X0+H*I ; N=1; B=1.; S=1.=B*X**2/(2.*N*(2.*N-1.))=N+1; S=S+B;(ABS(B) < EPS) EXITDO=(1./2.)*(exp(x)+exp(-x))2, X,S,Y,N; WRITE (1,2) X,S,Y,NDO
FORMAT (' X=',F6.3,3X,'S=',F10.3,3X,'Y=',F10.3,3X,'N=',I5)
END PROGRAM LAB3
Вывод
Представленная программа на некотором интервале значений подсчитывает
сумму заданного ряда и выводит результаты в виде таблице, где показывает
значение переменной, приближенное значение суммы, точное значение и количество
просуммированных элементов соответственно.
Цель работы. Изучить особенности описания и использования массивов в программе.
Задание. Разработать алгоритм решения выбранной по номеру варианта задачи, составить, отладить и просчитать программу с использованием массивов.
Наряду с простыми переменными в алгоритмических языках используются переменные с индексами, называемые массивами. Массив - это упорядоченная последовательность величин, обозначаемая одним именем. Величины, из которых состоит массив, называются элементами массива. Элемент массива обозначается с помощью имени массива и индексов, следующих в круглых скобках за именем массива. Индексы отделяются друг от друга запятыми и указывают положение элемента в массиве. Индексов может быть 1, 2 и т.д. вплоть до 7. Соответственно массивы бывают одномерные, двумерные и т.д.
Все массивы, используемые в программе, должны быть описаны, так как для хранения элементов массива в определенной последовательности отводится необходимый объем памяти. При описании указываются имя массива и затем в круглых скобках через запятую граничные пары, т.е. разделенные двоеточием минимальные и максимальные значения соответствующего индекса. При отсутствии двоеточия минимальное значение соответствующего индекса в Фортране по умолчанию равно единице. Для описания массивов в Фортране используются операторы описания типа переменных (REAL, INTEGER, COMPLEX, LOGICAL, CHARACTER, DOUBLE PRECISION), а также атрибут и оператор DIMENSION.
Рассмотрим несколько примеров описания массивов. Значения граничных пар
можно задавать с использованием именованных констант и константных выражений.
INTEGER, PARAMETER :: N=4, DIMENSION :: A(N,N), B(N), K(N+1,N+1),
C(0:N)
В этом примере оператор REAL c атрибутом DIMENSION описывает двумерный вещественный массив A, содержащий 16 элементов; одномерный вещественный массив B, содержащий 4 элемента; двумерный вещественный массив K, содержащий 25 элементов, и одномерный вещественный массив C, содержащий 5 элементов.
Объекты с общими атрибутами можно группировать в единый список, например,
следующий оператор описывает два двумерных вещественных массива D и E, каждый
из которых имеет 3 строки и 4 столбца.
REAL, DIMENSION (3,4) :: D, E
Операторы описания типа могут использоваться для описания массивов и без
атрибутов, но с указанием граничных пар, например,
INTEGER MIN(2,2), MAX(10)Q(5), SUMMA(3,3)
Здесь: MIN и MAX - целые массивы, содержащие 4 и 10 элементов соответственно; Q и SUMMA - вещественные массивы, содержащие 5 и 9 элементов.
Оператор DIMENSION также может использоваться для описания массивов, например, для описания одномерного вещественного массива F из 10 элементов
FF(-2:7)
Использование оператора DIMENSION без операторов описания типа, когда тип массива определяется по умолчанию возможно, но нежелательно. Операторы, описывающие массивы, необходимо располагать в начале программы перед первым исполняемым оператором.
В Фортране список операторов ввода READ и вывода PRINT или WRITE может содержать как имена простых переменных и элементов массива, так и имена массивов. В последнем случае вводу-выводу подлежат все элементы массива в «естественной последовательности» (т.е. сначала растет первый индекс, затем второй и т.д.). Так, если в программе описан массив A(2,2) и имеется оператор ввода READ *, A, то численные значения необходимо задавать в следующей последовательности: A(1,1), A(2,1), A(1,2), A(2,2), т.е. любая матрица вводится по столбцам. Для изменения порядка ввода-вывода или если требуется передать только часть элементов массива можно использовать неявную форму оператора цикла. Например, ввод матрицы A(2,2) по строкам осуществляет оператор READ *, ((A(I,J), J=1,2), I=1,2).
Не следует забывать, что в Фортране функции «что вводить (выводить)» и «как вводить (выводить)» распределены между операторами ввода-вывода и оператором FORMAT.
Если в программе предусмотрен ввод исходных данных с клавиатуры, то в процессе отладки приходится задавать одни и те же численные значения много раз. Поэтому, когда исходных данных достаточно много, удобнее записать их перед счетом программы в файл данных, а в программе предусмотреть оператор, считывающий данные из файла данных. Кроме того, результаты также имеет смысл выводить в файл данных, чтобы иметь возможность получить распечатку результатов счета. Обращение к файлу данных производится по его логическому номеру N, указанному в операторах READ (N,…) или WRITE (N,…). С помощью оператора OPEN можно как назначать логические номера уже имеющимся файлам, так и создавать новые файлы с указанием соответствующего логического номера, например, OPEN (1, FILE=’LAB4.TXT’). После выполнения этого оператора файлу LAB4.TXT будет соответствовать логический номер 1. Файл LAB4.TXT создается в папке проекта либо предварительно до запуска программы на счет, либо в процессе работы программы в момент выполнения оператора OPEN. Для завершения доступа к файлу используется оператор CLOSE.
Отличительной особенностью Фортрана является развитая система операций с массивами. Операции над массивами и сечениями массивов задают параллелизм действий над компонентами массивов (или массива). Такие средства, с одной стороны, позволяют пользователю лаконично и сжато описать алгоритм обработки массивов и, с другой стороны, дают возможность компилятору генерировать более эффективный код с учетом особенностей конкретного компьютера. Очевидно, что наиболее эффективно использование этих возможностей для вычислительных систем, имеющих аппаратные средства для векторной обработки.
В Фортран встроено большое число функций, позволяющих:
· выполнять вычисления в массивах, например, суммировать элементы массива или находить его максимальный элемент;
· преобразовывать массивы, например, можно получать из одномерного массива двумерный;
· получать справочные данные о массиве (размер, форма и значения границ каждого измерения).
Задан массив В(4). Вычислить элементы матрицы D(4,4) по формулам
Найти максимальные элементы D и B. Печатать B, D.
Текст программыlab4::I,J,parameter::N=4,dimension(N,N)::D,dimension(N)::B::S, k1, k1
FORMAT ('vvedite 4islennoe zna4enie elementov massiva B(4)')*, BI=1,4; DO J=1,4(0<=(abs(B(I)+B(J)))<3.14) THEN(I,J)=sin(B(i)+B(J))IF (3.14<=(abs(B(I)+B(J)))<6.28) THEN(I,J)=cos(B(i)+B(J))(I,J)=sin(B(I)-B(J))IFDODO10, (D(I,1:N),I=1,N)
FORMAT ('Dvumernii massiv D'/4(4F10.5/))4, B
FORMAT ('Odnomernii massiv B'/4F10.3)=maxval(d);
S=maxval(b)*, "S=", S*, 'k=', k
Вывод
Данная программа считает двумерный массив (Матрицу 4х4) по заданным
формулам и введенным с клавиатуры значениям одномерного массива (вектора), а
также выводит на экран максимальные значения этих массивов.
Задание: Используя методы половинного деления, найти корни нелинейных уравнений f1(x)=0.
Решение нелинейных уравнений вида f(x)=0 заключается в отыскании одного или нескольких корней, т.е. таких значений аргумента x, для которых функция f(x) обращается в нуль.
Решение нелинейных уравнений обычно состоит из двух этапов:
) Отделение, или локализация корней, т.е. отыскание таких отрезков [a,b] (одного или нескольких), внутри которых имеется только один корень нелинейного уравнения.
) Уточнение приближенного значения корня до некоторой заданной степени точности. Отделить корни в некоторых случаях можно графически.
Локализовать корень уравнения можно также программно, вычисляя функцию f(x) для значений x, изменяющихся с некоторым заданным шагом h. При этом отыскиваются два таких соседних значения x, для которых f(x) имеет противоположные знаки. Алгоритм отделения корня удобно оформить в виде подпрограммы. В качестве параметров подпрограммы можно выбрать следующие: F,X0,Xк,H,A,B,IER.
Входные параметры:- имя внешней функции f(x);,Xк - соответственно левая и правая границы отрезка оси x, на котором отделяется корень уравнения;- шаг перебора аргумента функции.
Выходные параметры:,B - соответственно левая и правая границы отрезка [a,b], содержащего первый, считая от точки X0 вправо, корень нелинейного уравнения;- код ошибки. IER=0, если на участке от X0 до Xк с шагом H найден отрезок [A,B], содержащий корень уравнения; IER=1, если корень не локализован.
Алгоритм отделения корня нелинейного уравнения может быть следующим:
) Зададим IER=1, т.е. предполагаем, что на отрезке от X0 до Xк корней нет. В дальнейшем проверим, так ли это.
) Зададим начальное значение аргумента функции X=X0.
) Вычислим значение функции в точке X: Y=F(X).
) Изменим значение аргумента функции на величину шага : X=X+H .
) Проверим, лежит ли X внутри [X0,Xк]: если X>Xк , то возвращаемся в вызывающую программу. В этом случае отрезок [A,B] не найден,IER=1.
) Вычислим значение функции в новой точке X: Z=F(X).
) Проверим, изменила ли функция знак при последнем изменении аргумента. Если не
) В противном случае определим границы отрезка [A,B] по формулам A=X-H, B=X,
изменим код ошибки IER=0 и вернемся в вызывающую программу.
МЕТОД ПОЛОВИHHОГО ДЕЛЕHИЯ состоит в построении последовательности вложенных отрезков, на концах которых функция принимает значения разных знаков. Каждый последующий отрезок получают делением предыдущего пополам. Процесс построения последовательности отрезков позволяет найти корень уравнения f(x)=0 с любой заданной точностью.
В качестве параметров подпрограммы метода половинного деления можно выбрать
следующие: F,BL,AL,EPS,C,A,IER.
Входные параметры:- имя внешней функции f(x);L,BL - соответственно левая и правая граница отрезка, содержащего один корень уравнения f(x)=0;- точность вычисления корня.
Выходные параметры:- корень уравнения (если он найден);
A - количество итераций, которое потребовалось выполнить для вычисления корня с заданной точностью;- код ошибки. IER=0, если корень найден; IER=1, если A>B или на отрезке [A,B] нет корня, т.е. если F(A)*F(B)>0.
Алгоритм метода половинного деления:
) Зададим код ошибки IER=1.
) Проверим, правильно ли заданы исходные данные: если F(A)*F(B)>0 или A>B, то возвращаемся в вызывающую программу.
) Зададим текущие границы отрезка, содержащего корень A1=A, B1=B; зададим начальное число итераций A=0 и IER=0; вычислим значение функции в точке A1: Y=F(A1).
) Вычислим середину отрезка [A1,B1]: C=.5*(A1+B1); изменим счетчик итераций на единицу : N=N+1.
) Если длина текущего отрезка [A1,B1] меньше заданной точности, то возвращаемся в вызывающую программу.
) Проверим, внутри какого из отрезков [A1,C] или [C,B1] лежит корень уравнения. Если корень лежит внутри [A1,C], то изменяем правую текущую границу отрезка, содержащего корень, в противном случае - левую: если F(A1)* F(C)<0, то B1=C, иначе A1=C; итерационный процесс повторяется с пункта 4.
Уравнение:
Текст программы
function F(x)
F=((x-3.)*cos(x))-1.zadanie5C1ierF=0.otdel(F, x0, 6., 0.1, a, b, ier)(*,*)mpd(F, a, b, 1e-5, C1, ier1)2, a, b, C1
FORMAT (' a=',F8.1, 3X, 'b=', F8.1, 3X, 'X=', F8.1)otdel(f, x0, xk, h, a, b, ier)x0, xk, h, a, b, x, y, zierF=x0; y=F(x); ier=1=x+h(x>=xk) return=F(x)(y*z<0.) exit=x-h; b=x; ier=0mpd(F, a, b, eps, c, ier)F, a, eps, c, al, bl, yierF=1(F(a)*F(b)>0.) return=a; bl=b; y=F(al); ier=0=(al+bl)/2.(y*F(c)>0.) then=c=c(bl-al<eps) exit
end
Проверка в MATHCAD:
Вывод
Данная программа находит корни уравнения методом половинного деления, т.е. каждый интервал значений делит пополам, проверяет каждый полученный отрезок на наличие в нем корня уравнения и производит эту операцию с удовлетворяющим условию отрезком до тех пор, пока полученное значение корня не составит заданную точность. Затем было проверено полученное значение в математическом редакторе MathCAD. Данное значение идентично первому с заданной точностью.