- •4. Организация программ со структурой вложенных циклов
- •4. Организация программ со структурой вложенных циклов
- •; // Конец второго внутреннего цикла
- •//Вычисление и печать таблицы умножения чисел от 1 до 100
- •Write(I*j); // умножение выполняется 10000 раз
- •Begin begin
- •WriteLn(s:7:2); WriteLn(s:7:2);
- •Вычисление определенного интеграла с заданной точностью
- •Пример программы вычисления определенного интеграла с точностью методом трапеций
- •Задания 4.1 на вычисление интеграла с точностью.
- •Вычисление наибольшего (наименьшего) значения функции с заданной точностью на заданном интервале
- •// Числения максимума
- •// Тервала
- •Задания 4.2 на нахождение экстремума функции с заданной точностью.
- •Обработка матриц
- •Менее предпочтительными, но допустимыми будут объявления типа
- •X:array[1.. MMax, 1..NMax] of Real;
- •X:array[1..12, 1..14] of Real;
- •Пример 1 выполнения задания на матрицы
- •Пример 2 выполнения задания на матрицы
- •Пример 3 выполнения задания на матрицы
- •Пример 4 выполнения задания на матрицы
- •Задания 4.3 на обработку матриц (вложенные циклы)
until (Y<Ymax)or(X>=B);
Xn:= Xmax-H; //определение левого конца нового интервала вы-
// Числения максимума
if Xn<A then Xn:=A; //проверка, чтобы не выйти за пределы ин-
// Тервала
Если известны аналитические выражения для первой и второй производных, то можно найти значение аргумента, при котором первая производная обращается в ноль (решить уравнение, например, методом деления отрезка пополам) и определить знак второй производной в найденной точке. Знак второй производной позволит определить вид экстремума (максимум или минимум) или его отсутствие на заданном интервале. В случае отсутствия экстремума следует сделать запрос о нахождении наибольшего или наименьшего значения функции.
Пример программы вычисления наибольшего (наименьшего) значения функции приведен ниже. В программе реализованы три рассмотренных подхода к определению максимального (мингимального) значения функции на заданном интервале.
program extremum;
{Вычисление наибольшего(наименьшего) значения функции
y=2x3 +10x2 +6x-20 в интервале [a,b] с заданной точностью eps
с начальным шагом изменения аргумента h}
{первая производная функции y’=6x2 +20x+6,
вторая производная y’’=12x+20}
{$APPTYPE CONSOLE}
uses
SysUtils;
var
X,A,B,Aa,Bb,H,Y,Ymax,Ya,Yb,Ysr,Eps,Xmax,Dx,Xn,Xsr:Real;
I,N1,N2,K,Mon:Integer;
begin
WriteLn('Введите a,b,eps,h');
ReadLn(A,B,Eps,H);
Mon:=0; //признак монотонности
//определение точки на заданном интервале, в которой первая
//производная функции обращается в ноль (уточнение корня
//уравнения методом деления отрезка пополам)
Ya:= 6*A*A+20*A+6;
if Ya=0 then
Xmax:=A
else
begin
Yb:=6*B*B+20*B+6;
if Yb=0 then
Xmax:=B
else if Ya*Yb>0 then
begin
WriteLn ('Функция на заданном интервале изменяется’
+' монотонно');
WriteLn ('Для нахождения максимума введите 1,'
+' для минимума - -1');
ReadLn(K);
Mon:=1;
end
else
begin
Aa:=A;
Bb:=B;
Xsr:=(Aa+Bb)/2;
Ysr:= 6*Xsr*Xsr+20*Xsr+6;
while (Abs(Bb-Aa)>Eps)and(Ysr*Ya<>0) do
begin
if Ya*Ysr>0 then Aa:=Xsr else Bb:=Xsr;
Xsr:=(Aa+Bb)/2;
Ysr:= 6*Xsr*Xsr+20*Xsr+6;
end;
Xmax:=Xsr;
end;
end;
//определение знака второй производной в критической точке
//с целью определения вида экстремума
//(вторая производная отрицательна – максимум,
//вторая производная положительна – минимум)
if Mon=0 then
begin
if 12*Xmax+20<0 then
K:=1
else
K:=-1;//поиск минимума сводится к поиску максимума
//функции –f(x)
//вычисление значения функции в критической точке
Ymax:=((2*Xmax+10)*Xmax+6)*Xmax-20;
WriteLn('ymax=',ymax:10:5,' xmax=',xmax:10:5);
ReadLn;
end;
//поиск максимума функции с использованием табулирования
//значений функции при шаге изменения аргумента, равном
//требуемой точности
N1:=Trunc((B-A)/Eps)+1;
//установка начального значения для максимума
Ymax:=((2*A+10)*A+6)*A-20;
Xmax:=A;
Dx:=Eps;
for I:=1 to N1-1 do
begin
X:=A+I*Dx;
Y:= K*(((2*X+10)*X+6)*X-20);
if Y>Ymax then
begin
Ymax:=Y;
Xmax:=X;
end;
end;
WriteLn ('ymax=',Ymax:10:5,' xmax=',Xmax:10:5,' n=',N1);
ReadLn;
//вычисление максимума функции с использованием итерационного
//(вложенного) цикла
N2:=0; //количество вычислений значения функции
Xn:=A;
//установка начального значения для максимума
Ymax:=((2*A+10)*A+6)*A-20;
Xmax:=A;
while H>Eps do
begin
I:=0;
//цикл определения максимума функции
//на очередном интервале изменения аргумента
repeat
I:=I+1;
X:=Xn+(I-1)*H; //вычисление текущего значения аргумента
//вычисление значения функции в очередной точке
Y:=K*(((2*X+10)*X+6)*X-20);
N2:=N2+1;
if Y>Ymax then
//определение нового максимума и соответствующего
//значения аргумента
begin
Ymax:=Y;
Xmax:=X;
end;
until (Y<Ymax)or(X>=B);
Xn:= Xmax-H; //определение левого конца нового интервала
//вычисления максимума
//проверка, чтобы не выйти за пределы интервала
if Xn<A then
Xn:=A;
H:=H/2; //уменьшение шага изменения аргумента в два раза
end;
WriteLn('ymax=',Ymax:10:5,' xmax=',Xmax:10:5,' n=',N2);
ReadLn;
end.