Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Метод покоординатного спуска

Автор: Екатерина 26.05.2007 22:58

Ребят, помогите, пожалуйста ))
Есть программа на Паскале, которая находит минимум заданной функции методом покоординатного спуска, используя в качестве вспомогательного метода - Золотое сечение.
Программа не моя, я вообще полный лох в программировании, а она при компиляции выдает ошибку:
Procedure GOLD(A,B,E:real; var X:real; function F:real); - "Unknown Identifier"

С виду вроде все правильно, в чем может быть ошибка?

Вот полный текст программы:

program pokoord;
uses crt;

type VEC=array [1..8] of real;
var E,E1,R:real; I,J,N:integer; Z,Z0,Z9,Z1:VEC;
Function F(x:real):real; (*минимизируемая функция*)
begin Z[i]:=X;
R:=0.9397*Z[1]+0.342*Z[2];
F:=R;
end;
Procedure GOLD(A,B,E:real; var X:real; function F:real); (*золотое сечение*)
const G=0.618034;
var X1,X2,F1,F2,F3,R:real;
begin R:=(B-A)*G; X1:=A+R; F1:=F(X1); X2:=B-R; F2:=F(X2);
while R>E do begin R:=R*G;
if F1<F2 then begin
X:=X2+R; X2:=X1; F2:=F1; F1:=F(X); X1:=X
end else begin
X:=X1-R; X1:=X2; F1:=F2; F2:=F(X); X2:=X
end
end
end;
Procedure COORD (N:integer; E,E1:real; var i:integer; var Z,Z0,Z9,Z1:VEC); (*покоординатный спуск*)
var L:integer; X:real;
begin
for i:=2 to N do Z[i]:=Z1[I];
repeat L:=0;
for i:=1 to N do begin GOLD (Z0[i],Z9[i],E1,X,F);
if abs(X-Z1[i])>E then L:=1; Z1[i]:=X
end
until L=0
end;
Begin (*основная программа*)
clrscr;
repeat write('N,E,E1?'); readln(N,E,E1);
for i:=1 to N do begin write('Z0,Z9,Z1 -',I:1,'?');
readln(Z0[i],Z9[i],Z[i])
end;
COORD (N,E,E1,I,Z,Z0,Z9,Z1);
for i:=1 to N do writeln ('Z(',I:1,')=',Z1[i]);
writeln ('F=',R);
until false
readkey;
End.

Автор: volvo 26.05.2007 23:06

Конструировать тип прямо в описании заголовка процедуры нельзя... Кроме этого у тебя были еще ошибки.

Вот так программа компилируется:

program pokoord;
uses crt;

type VEC=array [1..8] of real;
var E,E1,R:real; I,J,N:integer; Z,Z0,Z9,Z1:VEC;

type
functype = function(x: real): real;

Function F(x:real):real; FAR; (*минимизируемая функция*)
begin Z[i]:=X;
R:=0.9397*Z[1]+0.342*Z[2];
F:=R;
end;
Procedure GOLD(A,B,E:real; var X:real; F: functype); (*золотое сечение*)
const G=0.618034;
var X1,X2,F1,F2,F3,R:real;
begin R:=(B-A)*G; X1:=A+R; F1:=F(X1); X2:=B-R; F2:=F(X2);
while R>E do begin R:=R*G;
if F1<F2 then begin
X:=X2+R; X2:=X1; F2:=F1; F1:=F(X); X1:=X
end else begin
X:=X1-R; X1:=X2; F1:=F2; F2:=F(X); X2:=X
end
end
end;
Procedure COORD (N:integer; E,E1:real; var Z,Z0,Z9,Z1:VEC); (*покоординатный спуск*)
var i, L:integer; X:real;
begin
for i:=2 to N do Z[i]:=Z1[I];
repeat L:=0;
for i:=1 to N do begin GOLD (Z0[i],Z9[i],E1,X,F);
if abs(X-Z1[i])>E then L:=1; Z1[i]:=X
end
until L=0
end;
Begin (*основная программа*)
clrscr;
repeat write('N,E,E1?'); readln(N,E,E1);
for i:=1 to N do begin write('Z0,Z9,Z1 -',I:1,'?');
readln(Z0[i],Z9[i],Z[i])
end;
COORD (N,E,E1,Z,Z0,Z9,Z1);
for i:=1 to N do writeln ('Z(',I:1,')=',Z1[i]);
writeln ('F=',R);
until false;
readkey;
End.


Автор: Екатерина 26.05.2007 23:51

Спасибо smile.gif))

Автор: So Slow 12.01.2008 9:08

как я понел эта программа взята из книги Мудров "А.Е.Численные методы для ПЭВМ на языках Бейсик,Фортран и Паскаль" и она находит минимум для ф-ии f(z1,z2)=exp( z1^2 +z2^2) + 2*z1- 3.5*z2
только вот не могу понять как данная ф-ия задается в программе?