Исправить ошибку в цикле - Pascal
Формулировка задачи:
Program Lab13;
label 20;
label 10;
Var
x,y,x1,y1,a,a0,e,g,dx,dy,grad,f0,f1:real;
i,j,n:integer;
Function f(x,y:real):real;
begin
f:=6*x-0.9*y+exp(0.36*x*x+0.16*y*y);
End;
begin
x:=1;
y:=1;
i:=1;
j:=0;
a:=0.1;
a0:=a;
e:=0.1;
n:=20;
g:=0.0001;
Writeln(' N a x y df/dx df/dy grad f(x,y) f(x,y)');
dx:=(f(x+g,y)-f(x,y))/g;
dy:=(f(x,y+g)-f(x,y)/g);
grad:=dx*dx+dy*dy;
grad:=sqrt(grad);
while e<=grad do
begin
f0:=f(x,y);
writeln(i:3,' ',a:4:4,' ',x:4:4,' ',y:4:4,' ',dx:4:4,' ',dy:4:4,'grad:4:4',' ',f(x,y):4:4);
x1:=x;
y1:=y;
x:=x-dx*a;
y:=y=dx*a;
f1:=f(x,y);
while f0>f1 do
begin
j:=j+1:
f:=f1;
x1:=x;
y1:=y;
x:=x-dx*a*j;
y:=y=dy*a*j:
f1:=f(x,y);
end;
x:=x1;
y:=y1;
inc(i);
if i<n then
begin a:=a*(j-1);
if a<o tjem
begom a:=a0/10;
a0:=a;
end;
goto 10;
end;
if i=n then
goto 20;
end;
end;
20:
Writeln(i:3,' ',a:4:4,' ',x:4:4,' ',y:4:4,' ',dx:4:4,' ',dy:4:4,' ',grad:4:4,' ',f(x.y):4;4);
end.Решение задачи: «Исправить ошибку в цикле»
textual
Листинг программы
Function f(x,y:real):real;
begin
f:=6*x-0.9*y+exp(0.36*x*x+0.16*y*y);
End;
Var
x,y,x1,y1,a,a0,e,g,dx,dy,grad,f0,f1:real;
i,j,n:integer;
begin
x:=1;
y:=1;
i:=1;
j:=0;
a:=0.1;
a0:=a;
e:=0.1;
n:=20;
g:=0.0001;
Writeln(' N a x y df/dx df/dy grad f(x,y) f(x,y)');
dx:=(f(x+g,y)-f(x,y))/g;
dy:=(f(x,y+g)-f(x,y)/g);
grad:=dx*dx+dy*dy;
grad:=sqrt(grad);
while (e<=grad) and (i<>n) do
begin
f0:=f(x,y);
writeln(i:3,' ',a:4:4,' ',x:4:4,' ',y:4:4,' ',dx:4:4,' ',dy:4:4,' ', grad:4:4,' ',f(x,y):4:4);
x1:=x;
y1:=y;
x:=x-dx*a;
y:=y-dx*a;
f1:=f(x,y);
while f0>f1 do
begin
j:=j+1;
f0:=f1;
x1:=x;
y1:=y;
x:=x-dx*a*j;
y:=y-dy*a*j;
f1:=f(x,y);
end;
x:=x1;
y:=y1;
inc(i);
if i<n then
begin
a:=a*(j-1);
if a<0 then
begin
a:=a0/10;
a0:=a;
end;
end;
end;
Writeln(i:3,' ',a:4:4,' ',x:4:4,' ',y:4:4,' ',dx:4:4,' ',dy:4:4,' ',grad:4:4,' ',f(x,y):4:4);
end.
Объяснение кода листинга программы
- Создаётся функция
fс параметрамиxиy, которая возвращает значение типаreal. - Задаются переменные:
x,y,x1,y1,a,a0,e,g,dx,dy,grad,f0,f1типаreal.i,j,nтипаinteger.
- Присваиваются начальные значения переменным:
x := 1,y := 1,i := 1,j := 0,a := 0.1,a0 := a,e := 0.1,n := 20,g := 0.0001. - Выводится заголовок таблицы.
- Вычисляются значения
dxиdy. - Вычисляется значение градиента
gradи его корень. - Запускается цикл
while, в котором происходит оптимизация функции. Каждая итерация цикла вычисляет новые значения переменных и выводит их значения, пока значенияeиiудовлетворяют условию. - Выводятся финальные значения переменных после цикла.