6.6 Лабораторная работа №6. Решение задачи безусловной оптимизации функций одной переменной Требуется найти минимум заданной функции одной переменной методами равномерного поиска, золотого сечения и методом Ньютона. Пример. Пусть задана функция одной переменной f ( x) x 4 2 x 2 4 x 1. Требуется найти минимум функции на интервале [-10,10] с заданной точностью eps=0.001. 6.6.1 Метод равномерного поиска Метод реализован в процедуре Search. Входные параметры: минимизируемая функция f типа FType, где FType=Function (x: Real): Extended ; интервал неопределенности [a,b], на котором будет осуществляться поиск; точность вычислений E; Выходные параметры: интервал, в котором лежит искомое значение x; f min -минимальное значение функции ; к- количество итераций . Текст программы. Function Search(a,b : Real; N : Integer; f : FType;var Res : Byte; E : Real) : Extended; Var Setka : Array of Real; //Содержит сетку узлов h : Real; //Шаг I : Integer; min : Extended; //Значение минимального элемента k : Integer; //Номер минимального элемента Begin If N<=2 Then Begin //Недопустимое число узлов сетки, должно быть больше 2-ух Res:=1;//Код ошибки Result:=0; Exit; End Else Begin Res:=0;//Ошибки нет End; If b<=a Then Begin //Границы заданы неверно Res:=2;//Код ошибки Result:=0; Exit; End; h:=(b-a)/(N-1); //Вычисления шага SetLength(Setka,N); Setka[0]:=a;Setka[N-1]:=b; //Заполнение узлов сетки For I:=1 to N-2 Do Setka[I]:=a+h*I;//Заполнение узлов сетки min:=f(Setka[0]);k:=0; //Поиск минимального элемента for I:=1 to N-1 do if f(Setka[I])<min Then Begin min:=f(Setka[I]);k:=I;End; If (k=0) OR (k=N-1) Then Begin Result:=Setka[k];Exit;End; //Минимум находится на границе IterCount:=1; While (Setka[k+1]-Setka[k-1])>E do //Пока требуемая точность не достигнута делать ... Begin a:=Setka[k-1]; //Переход к новым границам b:=Setka[k+1]; h:=(b-a)/(N-1); //Вычисления шага Setka[0]:=a;Setka[N-1]:=b; //Заполнение узлов сетки For I:=1 to N-2 Do Setka[I]:=a+h*I;//Заполнение узлов сетки min:=f(Setka[0]);k:=0; //Поиск минимального элемента for I:=1 to N-1 do if f(Setka[I])<min Then Begin min:=f(Setka[I]);k:=I;End; Inc(IterCount); End;//Конец цикла Result:=Setka[k]; End; Результат работы программы. Полученный интервал равен [-0.688;-0.680]. fmin=-0.581 к=2 6.6.2 Метод золотого сечения Метод реализован в процедуре Gold_SechEx. Входные параметры: минимизируемая функция f типа FType, где FType=Function(x : Real) : Extended ; интервал неопределенности [a,b], на котором будет осуществляться поиск; точность вычислений E; Выходные параметры: RES - код ошибки; интервал, в котором лежит искомое значение x; fmin -минимальное значение функции; к- количество итераций. Текст программы. Function GoldSechEx(a,b : Real;f : FType;var Res : Byte; E : Real): Real; var c,d : Real; //c,d - Точки деления Begin If b<=a Then Begin //Границы заданы неверно Res:=1;//Код ошибки Result:=0; Exit; End Else Res:=0; c:=a+0.382*(b-a);//Задание точек деления d:=a+0.618*(b-a);//Задание точек деления If f(c)>f(d) Then //Проверка условий теоремы Begin a:=c; //Вычисление новых границ и точек деления c:=d; d:=c+0.382*(b-c); End Else Begin b:=d; //Вычисление новых границ и точек деления d:=c; c:=a+0.318*(b-a) End; IterCount:=1; While (b-a)>E do Begin If f(c)>f(d) Then //Проверка условий теоремы Begin a:=c; //Вычисление новых границ и точек деления c:=d; d:=c+0.382*(b-c); End Else Begin b:=d; //Вычисление новых границ и точек деления d:=c; c:=a+0.318*(b-a); End; Inc(IterCount); End;//Конец цикла Result:=a+(b-a)/2; End; {Function GoldSechEx;} Результат работы программы. Полученный интервал равен [-0.683;-0.682] fmin=-0.581 К=22 6.6.3 Метод Ньютона Метод реализован в процедуре Search. Входные параметры: a,b - границы поиска минимума; f – функция, которую нужно минимизировать; df и ddf – первая и вторая производные соответственно; E – требуемая точность; X – на входе хранит начальное приближение, на выходе возвращает точку минимума. Выходные параметры: Res – возвращает код ошибки или ноль, если ошибок не было; X -точка минимума; fmin -минимальное значение функции ; к- количество итераций . Текст программы. Function Search(a,b : Real; f,df,ddf : FType;var Res : Byte; E : Real;Var X : Real) : Extended; Var I,J : Integer; X1 : Real; Begin IterCount:=0; X1:=X; Repeat X:=X1; X1:=X-df(X)/ddf(X); Inc(IterCount); Until (Abs(X1-X)<E) Or (X<a) Or (X>b); Result:=f(X); End; Результат работы программы. Полученная точка минимума х=-0,682 fmin=-0.581 К=5 Варианты заданий 1 f(x)=x2+e-0.35xmin 3 f(x)=x4-1,5arctgxmin 5 f(x)=-4x+e|x-0.2|min x2 7 f ( x ) 10 x ln x min 2 4 9 f(x)=x -1,1arctg1,5xmin 3 11 f ( x ) 13 x 5 x x ln x min 15 f(x)=xsin x+2cos xmin 17 f(x)= 1 x 2 e 2 x min 19 f(x)=x2+2e-0.65xmin 21 f(x)=x4-1,3arctg 1,5xmin 23 f(x)=x2+3x(lnx-1)min 25 f(x)=x2-2x-2cos xmin 27 f(x)=-3,4x+e|x-0,4|min 29 f(x)=cos x/x2min 2 f(x)=x2+3e-0,45xmin 4 f(x)=x2-x+e-xmin 6 f(x)=x-lnxmin 1 8 f ( x ) e x min x 10 f(x)=-2,8x+e|x-0,6|min 12 f ( x ) e x 1 x 3 2 x min 3 16 f(x)=-2,2x+e|x-0,8|min 18 f(x)=(x-4)2+lnxmin 20 f(x)=x4-0,9arctg2,5xmin 22 f(x)=2x2+x+cos2xmin 24 f(x)=x4+e-xmin 26 f(x)=x2+5e-0,05xmin 28 f(x)=x2-2x-e-xmin 30 f(x)=ex+e-2x+2xmin