Хорошо!
Решал такое тестовое уравнение с задачей Коши
. Точное его решение
.
Целевой функционал выглядел как
. Перешёл к сеточной постановке, задав сетку из 33 точек. Интеграл вычислял методом Ньютона - Котеса 4-го порядка (поэтому и 33 точки). Минимум функции многих переменных искал адаптивным методом случайного поиска (поэтому там два вложенных цикла). В качестве стартового набора значений функции брал случайный набор чисел на интервале
, кроме первой точки - она равна
. В самом алгоритме менялись все точки массива значений функции, начиная со второй. Программировал на PascalABS.NET. В результате получил функцию
, которая тоже является решением ДУ, но с другим начальным условием. Вот код:
Код:
PROGRAM INVERSE2;
TYPE ARG = ARRAY [1..33] OF DOUBLE;
VAR A,B,PI,T,HT: double;NT: INTEGER; M0: ARG; TT: TEXT;
FUNCTION NK4(H:DOUBLE; Y:ARG; N: INTEGER):DOUBLE;
VAR S:DOUBLE; I:INTEGER;
BEGIN
S:=0.0;I:=1;
WHILE (I <= N-4) DO
BEGIN
S:= S+ 7.0*(Y[I]+Y[I+4]) + 32.0*(Y[I+1] + Y[I+3]) + 12.0*Y[I+2];
I:= I + 4;
END;
NK4:= 2.0*H*S/45.0;
END;
function MF(A, B,ALFA: DOUBLE; NT:INTEGER;F:ARG):DOUBLE;
VAR HT,PI,T,Q: DOUBLE; DF, Y: ARG;
BEGIN
PI:=3.14159265358979;
HT:= (B - A)/(NT-1);
//производная
DF[1]:= (-3.0*F[1]+4.0*F[2]-F[3])/(2.0*HT);
DF[NT]:= (F[NT-2]-4.0*F[NT-1]+3.0*F[NT])/(2.0*HT);
FOR VAR I:=2 TO NT-1 DO
BEGIN
DF[I]:= (F[I+1]-F[I-1])/(2.0*HT);
END;
// подыинтегральное выражение
FOR VAR J:=1 TO NT DO
BEGIN
T := A + (J-1)*HT;
Y[J] := (DF[J]+F[J] * TAN(T) - 1.0/COS(T))**2.0;
END;
MF := NK4(HT, Y, NT);
end;
PROCEDURE MINIR2(A,B: DOUBLE; M0: ARG; NT: INTEGER);
VAR Z1,Z2,ALF,Z0,BET,ALFA: DOUBLE; M1, M2, K, M3: ARG;
BEGIN
ALF := (SQRT(5.0) + 1.0)*0.5; BET := (SQRT(5.0) - 1.0)*0.5;
Z0 := MF(A,B,ALFA,NT,M0); WRITELN('MU0= ',Z0);
FOR VAR KK:=1 TO 400 DO
BEGIN
WRITELN ('START OF STEP');
FOR VAR I:=1 TO NT DO BEGIN K[I]:=1.0; END;
FOR VAR I:=1 TO 4000 DO
BEGIN
FOR VAR MJ:= 2 TO NT DO //вот здесь и ниже меняются все элементы массива начиная со второго
BEGIN
M1[MJ]:= M0[MJ] + K[MJ]*(2.0 * RANDOM - 1.0);
END;
Z1 := MF(A,B,ALFA,NT,M1);
IF (Z1 <= Z0) THEN
BEGIN
FOR VAR MJ:= 2 TO NT DO
BEGIN
K[MJ] := ALF*K[MJ]; M2[MJ]:= M1[MJ] + ALF*(M1[MJ]-M0[MJ]);
END;
Z2 := MF(A,B,ALFA,NT,M2);
IF (Z2 < Z0) THEN
BEGIN
FOR VAR MJ:= 2 TO NT DO
BEGIN
K[MJ]:= ALF*K[MJ]; M0[MJ]:= M2[MJ];
END;
Z0 := Z2;
END
ELSE
BEGIN
FOR VAR MJ:=2 TO NT DO
BEGIN
K[MJ] := BET*K[MJ]; M0[MJ]:= M1[MJ];
END;
Z0 := Z1;
END;
END
ELSE
BEGIN
FOR VAR MJ:= 2 TO NT DO
BEGIN
M0[MJ]:= M0[MJ]; K[MJ] := BET*K[MJ];
END;
Z0 := Z0;
END;
END;
END;
writeln('MU_OPT = ',Z0);
ASSIGN(TT, 'TEXTMINI1.TXT');
REWRITE(TT);
FOR VAR I:=1 TO NT DO BEGIN WRITELN(TT,M0[I]);END;
CLOSE(TT);
WRITELN('PRESS');
END;
BEGIN
RANDOMIZE();
PI:=3.14159265358979; A:= PI; B:= 1.49*PI; NT := 33; HT := (B - A)/(NT-1); M0[1]:=1.0;
FOR VAR I :=2 TO NT DO BEGIN M0[I]:= -1.0 + 2.0*random(); END;
MINIR2(A,B,M0,NT);
READLN;
END.