КРАТКИЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ
Поиск наибольшего (наименьшего) значения осуществляется последовательным сравнением значений. Для нахождения наибольшего необходимо задать начальное значение наибольшего, равное заведомо малому числу. При этом поиск в цикле можно описать формулой: При нахождении наименьшего начальное значение следует взять равным заведомо большему числу, а поиск наименьшего в цикле осуществлять по выражению
Пример 1. Составить программу для нахождения наибольшего значения функции при изменении аргумента x от а до b с шагом h. Программа имеет вид PROGRAM MAX (INPUT,OUTPUT); VAR A,B,C,H,X,Y,YMAX:REAL; BEGIN READ (A,B,C,H); YMAX:=-1E30; X:=A; WHILE X<=B DO BEGIN Y:=ABS(C)*EXP(C*X-X*X); IF Y>YMAX THEN YMAX:=Y; X:=X+H END; WRITE (YMAX) END. Рассмотренный прием нахождения наибольшего (наименьшего) является универсальным, так как позволяет найти его даже в том случае, если функция не имеет экстремума (является монотонной) или имеет несколько экстремумов. Если функция имеет один экстремум, то затраты времени на решение можно существенно сократить, используя другой алгоритм. Для функции, имеющей один максимум, вычисляемые значения, находящиеся до максимума, всегда являются большими из всех предыдущих, т.е. После максимума функция начнет убывать, следовательно, все последующие значения меньше наибольшего из предыдущих. Поэтому, как только выполнится условие , необходимо прекратить вычисления в цикле. Для нахождения максимума можно записать выражение
Аналогично, для минимума
Пример 2. Составить программу для нахождения экстремума функции при изменении аргумента x от 0 до b/c с шагом h. Функция у всегда положительна и имеет один экстремум. При С>0 функция имеет минимум, а при с<0 - максимум. Поэтому сначала надо определить знак с и присвоить переменной N значение +1, если с положительно (функция имеет минимум), и значение - 1, если с отрицательно (функция имеет максимум). Программа имеет вид PROGRAM MINMAX (INPUT,OUTPUT); LABEL 40; CONST D=0; VAR A,B,C,E,H,X,Y,YM:REAL; N:INTEGER; BEGIN READ (A,B,C,H); IF C>0 THEN N:=l ELSE N:=-l; YM:=N*1E30; X:=D; E:=B/C; REPEAT Y:=ABS(A)*EXP(B*X+C*X*X); IF N*YM<=N*Y THEN GOTO 40 ELSE BEGIN YM:=Y; X:=X+H END UNTIL X>E; 40:WRITE (YM,N) END. Пример 3. Составить программу для нахождения наименьшего элемента массива Х(х1, x2, …, x50) и его порядкового номера. Значения элементов массива X после ввода размещаются в памяти ЭВМ. В качестве начального значения наименьшего целесообразно взять значение первого элемента. Сравнение выбранного элемента следует начинать со вторым, третьим и т. д. При выполнении условия xi<XMIN необходимо выполнять оператор присваивания XMIN: = Х[I]; и IMIN:=I; Так как значение первого элемента может оказаться наименьшим, то перед циклом наряду с оператором ХМIN:=Х[1]; необходимо записать IMIN:=1; Программа имеет вид PROGRAM MINX (INPUT.OUTPUT); CONST NMAS=50; VAR XMIN:REAL; I,IMIN,N:INTEGER; X:ARRAY [1..NMAS] OF REAL; BEGIN READ (N); FOR I:=l TO N DO READ (X[I]); XMIN:=X[1]; IMIN:=1; FOR I:=2 TO N DO IF X[I]<XMIN THEN BEGIN XMIN:=X[I]; IMIN:=I END; WRITE (XMIN,IMIN) END.
Контрольные вопросы. 1. Почему при нахождении наибольшего значения функции в качестве начального значения Ymax выбрано значение 1010 ? 2. Какие правила необходимо соблюдать при нахождении наибольшего значения функции? 3. Какие правила необходимо соблюдать при нахождении наименьшего значения функции? 4. С помощью какого оператора возможна проверка условия Y<Ymin ?
©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.
|