Нахождение наибольшего или наименьшего значения

Приёмы вычисления сумм, произведений и экстремальных значений

Вычисление суммы и произведения

Прием накопления суммычасто используется в различных приложениях. Суммируемыми элементами могут быть элементы массива или вычисляемые значения функции. В любом случае накопление суммы производится в цикле по рекуррентной формуле S=S+ Y, где S- промежуточная сумма, Y- слагаемое. Перед циклом в большинстве случаев начальное значение S должно быть равным нулю.

Фрагмент программы для вычисления суммы первых n элементов массива Y будет иметь вид:

 

S:=0;

for i:=1 to n do

S:= S+Y[i];

 

Фрагмент программы для вычисления среднего первых n значений функции Y(x), вычисляемых при значениях x, изменяемых от x0 с шагом dx будет иметь вид:

 

S:=0;

x:=x0;

for i:=1 to n do

begin

S:=S+Y(x)

x:=x+dx

end;

S:=S/n;

 

Вычисление произведения выполняется аналогичным образом, но перед циклом в большинстве случаев начальное значение P должно быть равным единице P:=1, а в цикле произведение накапливается по рекуррентной формуле P:=P·Y.

Пример. Вычислить значение суммы элементов массива X(n), n≤30.

 

const

nMax=30;

var S:Real;

X: array [1..nMax] of Real;

i:Integer;

begin

Write(' Введите количество элементов: ');

ReadLn (n);

WriteLn(' Введите элементы массива: ');

for i:=1 to n do

Read (X[i]);

ReadLn;

S:=0; //Начальное значение суммы

for i:=1 to n do

S:= S+X[i]; //Накопление суммы

WriteLn('Сумма элементов массива равна ', S:6:2);

. . . . . .

end.

Нахождение наибольшего или наименьшего значения

Поиск наибольшегоили наименьшегозначения может выполняться в имеющемся массиве или при вычислении значения функции.

При поиске в массиве начальному значению наибольшего Xmax (начальному значению наименьшего Xmin) присваивается значение первого элемента массива, а затем в цикле для очередного элемента массива Xi, i=2, 3,…,n, производится проверка: если Xi>Xmax
(Xi < Xmin), то переменной Xmax (переменной Xmin) присваивается значение Xi, иначе значение Xmax (Xmin) не изменяется.

Поиск максимального и минимального значений в массиве представляют следующие фрагменты программ

 

Xmax= X[1]; Xmin = X[1];

for i:=2 to n do for i:=2 to n do

if X[i] > Xmax then if X[i] < Xmin then

Xmax:=X[i]; Xmin:=X[i];

WriteLn('Xmax=', Xmax:6:2); WriteLn('Xmin=', Xmin:6:2);

 

При поиске наибольшего Ymax (наименьшего Ymin) из вычисляемых значений функции F(x) переменной Ymax (Ymin), которая после вычислений будет представлять максимальное (минимальное) значение функции, до входа в цикл следует присвоить одно из вычисляемых значений F(x), а в цикле для каждого очередного значения функции F(x) проверять: если F(x) >Ymax (F(x) <Ymin), то Ymax (Ymin) присвоить это значение функции.

Ниже представлены фрагменты программ поиска максимального и минимального значений функции y=e-xsin(5x), вычисляемых на значениях x, изменяющихся от a до b с шагом dx.

 

Ymax:=Exp(-A)*Sin(5*A); Ymin:=Exp(-A)*Sin(5*A);

X:=A+dx; Xk:=B+dx/2; X:=A+dx; Xk:=B+dx/2;

while X < Xk do while X < Xk do

begin begin

Y:= Exp(-X)*Sin(5*X); Y:= Exp(-X)*Sin(5*X);

if Y > Ymax then if Y < Ymin then

Ymax:=Y; Ymin:=Y;

end; end;

WriteLn('Ymax = ',Ymax); WriteLn('Ymin = ',Ymin);

 

Как видно из представленных фрагментов программ, их алгоритмы можно получить один из другого заменой одного знака отношения на другой, например, > на <.

Если заранее известно, что максимальное (минимальное) значение функции на заданном интервале больше (меньше) некоторой величины, например, -1015 (1015), то эту величину можно использовать в качестве начального значения при поиске максимального (минимального) значения функции, например, Ymax:=-1E15 (Ymin:=1E15).

Наряду с нахождением максимального/минимального значения функции (максимального/минимального значения в массиве) может потребоваться нахождение значения аргумента (индекса элемента массива), при котором оно достигается. Нахождение указанных значений при поиске максимума поясняют следующие фрагменты программ.

 

Поиск максимального значения функции Поиск максимального элемента

и соответствующего значения аргумента массива и его индекса

Ymax:=Exp(-A)*Sin(5*A);Xmax:=A; Xmin = X[1]; Imin:=1;

X:=A+dx; Xk:=B+dx/2; for i:=2 to n do

while X < Xk do if X[i] > Xmax then

begin begin

Y:= Exp(-X)*Sin(5*X); Xmax:=X[i];

if Y > Ymax then Imax:=i;

begin end;

Ymax:=Y; WriteLn('Xmax = ', Xmax:6:2);

Xmax:=X; WriteLn('Imax = ', Imax);

end;

end

WriteLn('Ymax = ',Ymax);

WriteLn('Xmax = ',Xmax);

 

Рассмотренный выше приёмы нахождения на заданном интервале максимума/минимума функции и точек (значений аргумента), на которых они достигаются, не следует путать с нахождением экстремумов функции, так как искомый максимум/минимум может находиться на границе интервала, где производная функции не равна нулю.

Поиск приближенных значений точек экстремумов функции F(X) и её значения в них, а также точек перегибов (экстремумов F'(X)), точек экстремальной кривизны (экстремума |F''(X)|/(1+(F'(X))2)3/2) могут иметь самостоятельное значение. Эти задачи можно решать ранее рассмотренными методами при вычисляемых по известным аналитически выражениям значениям производных. Однако, имея в виду, что аналитические выражения производных не всегда известны, приходится вычислять значения производных по разностным схемам или использовать более простые приёмы.

Например, приближенное значение точки экстремума-максимума (локального максимума) будет найдено, если на очередном значении аргумента, изменяемом с заданным шагом, окажется, что слева и справа от него функция имеет меньшие значения. Проверку можно ещё упростить: если заранее известно, что в начале исследуемого интервала функция растет, то точкой экстремума будет значение аргумента, после которой значение функции начнёт уменьшаться.