Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЭУМК ООМ.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
3.36 Mб
Скачать

Минимизация функции методом Квадратичной интерполяции-экстраполяции

Интерполяция функции Y(x) одной переменной х, заданной (n+1) узлами y(x), где i=0,1,2,...n, заключается в нахождении значений Y по значениям х, находящихся в отрезке [X0,..Xn). При интерполяции функция f(x) заменяется интерполяционным полиномом p(x),значения которого p(x) в узлах точно совпадают с y(x). Значение n задает степень полинома p(x). Существует ряд специальных видов полинома p(x).

Экстраполяция - получение значений Y(x) при х, не принадлежащих отрезку [X0,..Xn]. Для гладких y(x) экстраполяция целесообразна при х, выходящих за указанные пределы не более чем на h/2.

Метод заключается в замене f(x) в промежутке X1+(-)h, где X1 -начальное приближение, квадратичной параболой, экстремум которой вычисляется аналитически. После приближенного нахождения экстремума Xm можно задать X1=Xm и повторить поиск. Таким образом, с помощью итерационной процедуры значение Xm уточняется до получения его с заданной погрешностью e.

Этот метод обеспечивает поиск как максимумов, так и минимумов f(x), в том числе для случая f(x)=0, причем точка Xm может лежать в интервале X1+(-)h (интерполяция) и быть вне его (экстраполяция).

Алгоритм

1. Задаем начальное приближение X1 для Xm и вычисляем два смежных значения аргумента F(x): x0=x1-h и x2=x1+h, где h - полуинтервал интерполяции - экстраполяции.

2. Вычисляем три значения F(x): F(x)=F0, F(x1)=F1, F(x2)=F2.

3. Находим коэффициенты параболы Y(Х)=X2+BX+C,

C=F0/2h2-F1/h2+F2/2h2=(F0-2F1+F2)/2h2,

B=(-F0(2x1+h)+4F1x1-F2(2x1-h)/2h2

проходящей через выбранные три узла интерполяции - экстраполяции

F(x), и по ним вычисляем аналитически положение экстремума

Xm=-B/2C=(F0(2x1+h)-4F1x1+F2(2x1-h)/2*(F0-2F1+F2).

4. Проверяем выполнение условия ABS(Xm-X1)<e. Если оно не выполняется, задаем X1=Xm и идем к п.1. Если выполняется, считаем Xm найденным с заданной погрешностью e, вычисляем F(Xm) и останавливаем счет.

Составить программу, найти минимальное значение функции и сравнить с результатами, полученными ранее. Сделать вывод.

Программа метода Квадратичной интерполяции-экстраполяции

{Вычисление значения функции}

FUNCTION F(x:real):real;

begin

F:=2*x*x-exp(x);

end;

{Основная программа}

PROCEDURE MET2;

Var

ni:integer;

x,h,e,v,u,w,z:real;

BEGIN

Write('Введите начальное значение x:'); readln(x);

Write('Задайте интервал интерполяции h:'); readln(h);

Write('Задайте погрешность вычислений e:'); readln(e);

goto xy(1,5);writeln(' Текущие значения: ');

ni:=0;

repeat

ni:=ni+1;

z:=x;

v:=f(x);

x:=z-h;

w:=f(x);

x:=z+h;

u:=f(x);

x:=(w*(2*z+h)-4*v*z+u*(2*z-h))/(w-2*v+u)/2;

goto xy(1,6);writeln(' Итерация №',ni);

writeln(' x=',x:12:10,' F(x)=',f(x):12:10);

until(abs(x-z)<e);

writeln(' ---------- Минимум найден: -----------');

writeln(' x=',x:12:18,' F=',f(x):12:8);

end;

Метод пауэлла

Суть метода: используют несколько значений функции в определенных точках для аппроксимации функции обычным полиномом в небольшой области значений, затем положение минимума аппроксимируется положением минимума полинома, поскольку последний вычислить проще.

Если известно значение функции F(x) в 3 различных точках x1, x2, x3, равных соответственно F(x1), F(x2), F(x3),то функция F(x) может быть аппроксимированна квадратичным трехчленом Ф(x)=ax2+bx+c. В теории доказывается, что Ф(x) будет иметь минимум в точке x=-b/2a, если a>0 и можно аппроксимировать точку минимума функции F(x) значением &.

1/2*(F(x1)-F(x2)*(x2-x3)*(x3-x1)

&=1/2*(x1+x2)+ ----------------------------------------------------- .

(x1-x3)*F(x1)+(x3-x1)*F(x2)+(x1-x2)*f(x3)

Можно доказать, что при x1=0, x2=t, x3=2t это уравнение примет вид

4*F(x2)-3*(F(x1)-F(x3))

&=------------------------------- *t

4*F(x2)-2*F(x1)-2*F(x3)

и что при этом достигается минимум, если F(x1)+F(x3)>2*F(x2).

Эти теоретические изложения используются в методе Пауэлла.

Предположим, что заданна унимодальная функция одной переменной F(x), начальная аппроксимация положения минимума и длина шага h.

Алгоритм вычисления:

1. Вычислить F(A) и F(A+h);

2. Если F(A)<F(A+h), то взять в качестве 3-ей точки A-h и вычислить F(A-h), иначе взять A+2h и найти F(A+2h);

3. Используя эти 3 точки, найти & и вычислить F(&);

4. Если разница между наименьшим и следующим наименьшим значением функции меньше заданной точности, то процедура заканчивается;

5. Если нет, то точка с наибольшим значением отбрасывается, и возвращаемся на шаг 3. Но если оставив точку с наибольшим значением функции, мы определим конечные границы интервала, в котором лежит минимум, то следует действительно оставить это значение и затем вернуться на шаг 3.

Задание: найти минимум функции z=2x2-exp(x), сравнить с результатами, полученными ранее. Сделать вывод.

Исходные данные: е=0.0001, А=1, h=0,5,

Программа метода ПАУЭЛЛА

FUNCTION sgn(x:real):real; {знаковая функция}

begin

if x>0 then sgn:=1 else if x<0 then sgn:=-1 else sgn:=0;

end;

FUNCTION z(x:real):real;_1 _0{ вычисление функции }

begin

z:=2*x*x-exp(x);

end;

PROCEDURE MET1;{ метод 1 }

Label m1,m2;

Var

sim :char;

x,f :array [1..4] of real;

s1,s2,s3,xx,ff,dn,nm,a,h,e:real;

j,k,i,ni :integer;

BEGIN

ni:=0; Write('Задайте начальное значение A:'); readln(a);

Write('Задайте шаг h:');readln(h);

Write('Задайте точность E:');readln(e);

x[1]:=a; f[1]:=z(x[1]);

{ начать процесс с первых трех точек }

x[2]:=a+h; f[2]:=z(x[2]);

if f[1]<f[2] then

begin

x[3]:=a-h; f[3]:=z(x[3]);

end

else begin

x[3]:=a+2*h; f[3]:=z(x[3]);

end;

goto xy(1,5);writeln(' Текущие значения: ');

dn:=(x[2]-x[3])*f[1];

{вычисление первого аппроксимируемого минимума}

dn:=dn+(x[3]-x[1])*f[2]+(x[1]-x[2])*f[3];

nm:=(x[2]*x[2]-x[3]*x[3])*f[1];

nm:=nm+(x[3]*x[3]-x[1]*x[1])*f[2];

nm:=nm+(x[1]*x[1]-x[2]*x[2])*f[3];

x[4]:=nm/(2*dn); f[4]:=z(x[4]);

m1: for j:=1 to 3 do

{упорядочить значения функции }

for k:=j+1 to 4 do

if f[j]>f[k] then begin

xx:=x[j]; x[j]:=x[k]; x[k]:=xx;

ff:=f[j]; f[j]:=f[k]; f[k]:=ff;

end;

goto xy(1,6);writeln(' Итерация №',ni); ni:=ni+1;

for i:=1 to 4 do

writeln(' x[',i,']=',x[i]:12:10,' F[',i,']=',f[i]:12:10);

{закончить если получена заданная точность}

if abs(x[1]-x[2])<e then goto m2;

s1:=sgn(x[2]-x[1]);{запомнить три лучших точки}

s2:=sgn(x[3]-x[1]);

s3:=sgn(x[4]-x[1]);

if ((s1=s2) and (s1=-s3)) then

begin

x[3]:=x[4]; f[3]:=f[4];

end;

{вторая интерполяция}

dn:=(x[2]-x[3])*f[1]+(x[3]-x[1])*f[2]+(x[1]-x[2])*f[3];

ff:=(f[1]-f[2])/(2*dn);

ff:=ff*(x[2]-x[3])*(x[3]-x[1]);

x[4]:=(x[1]+x[2])/2+ff; f[4]:=z(x[4]);

goto m1; {повторить вторую интерполяцию}

m2: writeln(' ---------- Минимум найден: -----------');

writeln(' x=',x[1]:12:18,' F=',f[1]:12:8);

END;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]