Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Учебное пособие 1842

.pdf
Скачиваний:
10
Добавлен:
30.04.2022
Размер:
2.4 Mб
Скачать

Рие. IV.15. Поверхность, задаваемая функцией Розенброка

Рис. IV.16. Карта линий уровня функции Розенброка

98

Листинг IV.22. Файл R_y.m function z=R_y(x,y) N=length(x);

Z=zeros(N); for i=l:N

for j=l:N z(I,j)=200*(y(j)-x(i).^2);

end;

end;

7.Создайте файл R_xx.m (листинг IV.23), содержащий описание функции, возвращающей значение второй производной по переменной х.

Листинг IV.23. Файл R_xx.m function z=R_xx(x,y) N=length(x);

Z=zeros(N); for i=l:N for j=l:N

z(i,j)=1200*x(i).^2-400*y(j)+2; end;

end;

8.Создайте файл R_yy.m (листинг IV.24), содержащий описание функции, возвращающей значение второй производной по переменной у.

Листинг IV.24. Файл R_yy.m function z=R_yy(x,y) N=length(x);

z=zeros (N); for i=l:N

for j=l:N z(i,j)=200;

end;

end;

99

9. Создайте файл R_xy.m (листинг IV.25), содержащий описа-

B(2,l)=R_y(x,y);

ние функции, возвращающей значение смешанной производной

z=A^-l*B;

по переменным х, у.

 

12.Визуализируйте итерационный процесс (рис. IV.17-IV.19).

Листинг IV.25. Файл R_xy.m

 

» plot(x,'-x');

function z=R_xy(x,y)

 

» hold on

N=length(x);

 

» plot(у,'-о');

z=zeros(N);

 

» hold off

for i=l:N

 

» plot(z,'-o')

for j=l:N

 

» plot3(x,y,z,'-o'); grid on

z(i,j)=-400*x(i);

 

 

end;

 

 

end;

 

 

10. Создайте файл Rg.m (листинг IV.26), содержащий описание

 

функции, возвращающей значения обратной матрицы вторых

 

производных на вектор-градиент.

 

Листинг IV.26. Файл Rg.m

 

 

function z=Rg(x,y)

 

 

A(l,l)=R_xx(x,y);

 

 

A(l,2)=R_xy(x,y);

 

 

A(2,l)=R_xy(x,y);

 

 

A(2,2)=R_yy(x,y);

 

 

B(l,l)=R_x(x,y);

 

 

B(2,l)=R_y(x,y);

 

 

z=А^-1*В;

 

 

11.Создайте файл RnO.m (листинг IV.27), содержащий описа-

Рис. IV.17. Зависимость значений координат решения уравне-

ние функции, возвращающей значения переменных и соответ-

ния от номера итерации

ствующих значений функции Розенброка.

 

Листинг IV.27. Файл RnO.m

 

 

function z=Rg(x,y)

 

 

A(l,l)=R_xx(x,y);

 

 

A(l,2)=R_xy(x,y);

 

 

A(2,l)=R_xy(x,y);

 

 

A(2,2)=R_yy(x,y);

 

 

B(l,l)=R_x(x,y);

100

101

 

Рис. IV.18. Зависимость значения исследуемой функции от номера итерации

Рис. IV.19. Траектория итерационного процесса в пространстве

102

4.5. Решение систем нелинейных уравнений средствами пакета MATLAB

Средствами пакета MATLAB найдем решение системы нелинейных уравнений

x2 y 2 4 0

y x2 1 0

которая может быть записана в векторном виде

 

 

 

 

x 0,

 

 

F

 

 

где

 

 

 

 

 

 

 

 

 

 

 

2

2

 

 

F x

x1

x2

4

 

x

2

x2

1

,

 

 

 

 

 

1

 

 

xx1 .

x2

Для этого необходимо выполнить следующую последовательность действий:

1. Создать файл fm.m (листинг IV.28), содержащий описание функции, возвращающей значения функции F x .

Листинг IV.28. Файл fm.m function z=fm(x) z(l,l)=x(l).^2+х(2)^2-4; z(2,l)=x(2)-x(l)^2-l;

2. Задать вектор начального приближения.

»z(1,1)=1;

»z(2,1)=1;

3.Обратиться к встроенной функции fsolve(), возвращающей решение системы линейных уравнений.

» х = fsolve ( 'fm' ,z,optimset( 'f solve' ) ) Optimization terminated successfully:

103

Relative function value changing by less than OPTIONS . TolFun

%Процесс оптимизации завершен

%Относительная величина изменения функции меньше чем

%переменная OPTIONS . TolFun

х = 0.8895 1.7913

4.Проверить полученное решение.

»fm(x) ans =

l.0e-008 * 0.5162 -0.4888

Для одновременного вывода координат вектора решения уравнения и соответствующего значения вектор-функции следует выполнить команду:

»[х fval] = f solve ( 'fm' ,z,optimset('f solve'))

Optimization terminated successfully:

Relative function value changing by less than OPTIONS . TolFun x =

0.8895

1.7913

fval = l.0e-008 * 0.5162 -0.4888

Для вывода на экран монитора значений вектора-решения и соответствующего значения функции F x следует выполнить

команду:

» [х fval exitflag] = fsolve('fm',z,optimset('Display','Iter'));

104

 

 

Norm of

 

First-order

 

Iteration

Func-count f(x) step

optimality

CG-iterations

1

4

5

1

 

5

0

2

7

1

1

 

4

1

3

10

0.0026

0.223607

0.17

1

4

13

4.53078e-008

0.013546

0.00055

1

5

16

5.05378e-017

7.18274e-005 1.79e-008

1

Optimization terminated successfully:

Relative function value changing by less than OPTIONS.TolFun

В ряде случаев более удобным оказывается метод Ньютона, при использовании которого (как описано в разделе 4.2) необходимо знать в данной точке и значения функции, и значения якобиана, что позволяет реализовать итерационный процесс. Метод Ньютона в пакете MATLAB реализуется следующей последовательностью действий:

1. Создайте файл Fml.m (листинг IV.29), содержащий описание функции, возвращающей одновременно значения функции

F x и значения якобиана.

Листинг IV.29. Файл Fml.m function [z,J]=fm(x) z(l,l)=x(l).^2+х(2)^2-4; z(2,l)=x(2)-x(l)^2-l; J(l,l)=2*x(l);

J(l,2)=2*x(2);

J(2,l)=-2*x(l); J(2,2)=l;

2.Включите режим использования метода Ньютона и отображения итерационного процесса на экране.

» options=optimset('Jacobian','on','Display','Iter');

105

3.Обратитесь к встроенной функции fsolve(), возвращающей

решение системы линейных уравнений.

 

 

 

» [х fval exitflag] = fsolve('fml',z,options);

 

 

 

 

 

Normof First-order

 

 

 

 

Iteration

Func-count

f(x)

step

optimality

CG-iterations

1

2

 

5

1

 

5

 

0

2

3

 

1

1

 

4

 

1

3

4

 

0.0026

0.223607

 

0.17

 

1

4

5

4.53076e-008

0.013546

 

0.00055

1

5

6

5.04984e-017

7.18272e-005

1.79e-008

1

Optimization terminated successfully:

Relative function value changing by less than OPTIONS.TolFun

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

1. Создать файл F_sq.m (листинг IV.29), содержащий описание функции, возвращающей значения суммы квадратов функций f(x, у) = х2 + у2 -4 и g(x,y)=y-x2-1.

Листинг IV.30. Файл F_sq.m function z=F_sq(x)

s=fm(x); z=s(1,1).^2+s(2,1).^2;

Здесь мы предполагаем, что ранее файл fm.m, содержащий описание функции, возвращающей значения функций f (x,y) и g(х, у), уже создан.

2.Задать начальное приближение, в окрестности которого будет находиться минимум функции f(х, у)2 + g(x, у)2 .

» x=[1;1];

3.Обратиться к встроенной функции fminsearch ()

» fminsearch ('f_sq',х) ans =

0.8896

1.7913

Способы обращения к функции fminsearch( ) и список ее формальных параметров аналогичны способам обращения к функции fsolve () и списку ее формальных параметров.

107

106

V.ИНТЕРПОЛИРОВАНИЕФУНКЦИЙ

Вданном рассмотрим основные методы решения задачи об интерполяции функции, заданной таблично (интерполяционный полином, полином Лагранжа, полином Ньютона, сплайн-интерполяция) и опишем соответствующие алгоритмы и их программные реализации, а также обсудим использование соответствующих функций пакета MATLAB.

5.1. Постановказадачи

Пусть известные значения некоторой функции f(х) образуют следующую таблицу:

Исходные данные в задаче интерполяции

X

Хо

Х 1

. . .

Хп

f(x)

Уо

У1

. . .

Уп

 

 

 

 

 

Требуется получить значение функции f(x) для значения аргумента xє [ x0, xn ], несовпадающего ни с одним из значений хi (i = 0, 1, ..., n).

Решение задачи сводится к поиску некоторой приближающей функции F(х), близкой в определенном смысле к функции f(x), для которой известно аналитическое выражение.

Классический подход к решению задачи построения приближающей функции основан на требовании строгого совпадения значений функций f(x) и F(x) в точках x,(i = 0, 1,...,n)

F(x0) = y0,F(x1) = y1 ,..., F(xn) = yn.

(V.1)

108

В данном случае нахождение приближенной функции называется интерполированием, а точки х0, x1 ,..., хn называются узлами интерполяции.

Будем искать интерполирующую функцию F(x)

в виде

многочлена степени n:

 

 

 

 

n

n k

 

Pn (x) = a0xn + a1xn -1

+ … an -1x + an = ak n

 

(V.2)

k 0

Условия (V.1), наложенные на многочлен, позволяют однозначно определить его коэффициенты. Действительно, требуя для Рn(х) выполнения условий (V.1), получаем линейную систему, состоящую из (n + 1) уравнения:

n

 

 

ak xi n k yi ,

i 0, 1, , n.

(V.3)

k 0

Решив систему (V.3) относительно неизвестных а0, а1, … , аn , находим значения этих неизвестных и, подставив в (V.2), находим аналитическое выражение аппроксимирующей функции.

Система (V.4) всегда имеет единственное решение, т. к. ее определитель

x n

x n 1

1

 

 

 

 

 

0

0

 

 

 

 

x n

x n 1

1

 

,

(V.4)

1

1

 

 

 

 

 

 

x n

x n 1

1

 

 

 

n

n

 

 

 

 

 

 

 

 

известный в алгебре как определитель Вандермонда, отличен от нуля. Следовательно, интерполяционный многочлен Рn(х) существует и единственен.

109

Пример V.1. Решить, используя пакет MATLAB, задачу интерполяции с помощью полинома n-ой степени для функции f (х) = sin (x), заданной таблично в восьми точках на интервале [0, 2π].

1.Задайте табличные значения интерполируемой функции.

»N = 8;

»1=1: N;

»x(i)=2*pi/(N-l)*(i-l);

»y=sin(x);

2. Визуализируйте табличную зависимость и истинные значения функции (рис. V.1).

Рис. V.1. График функции f (x) = sin (x) и табличных значений, используемых для решения задачи интерполяции

110

»М=1000;

»j=l:M;

»X(j)=2*pi/(M-l)*(j-1);

»Y=sin(X) ,

»plot(x,y, 'о');

»hold on

»plot (x,y)

3. Создайте файл Pol.m (листингV.1), содержащий описание функции, возвращающейзначенияполинома(V.2).

Листинг V.1. Файл Pol. M function z=Pol (x,a)

N = length(a); M= length(x); for j=l:M s=0;

for i=l:N

s= s+a(i)*x(j).^(N-i); end;

z(j)=s;

end;

4. Создайте файл Vandermortd.m (листинг V.2), содержащий описание функции, возвращающей значения элементов матрицы Вандермонда.

Листинг V.2. Файл Vandermond. m function z = Vandermond (x)

N = length(x);

z = ones (N,N) ; for i = 1:N

z(i,j) = x(i). ^(N-j); end;

end;

111

5.Вычислите значения элементов матрицы Вандермонда. » M=Vandennond(x) ;

6.Вычислите значения коэффициентов полинома.

» а = М^ - 1*у';

7.Вычислите значения полинома в заданных промежуточных точках

» Y1=Pol (X,a);

8.Постройте разность между точными и интерполированными значениями функции (рис. V.2).

Рис. V.2. Погрешность аппроксимации функции f (x) = sin (x) полиномом 8-й степени.

112

5.2. Интерполяционный полином Лагранжа

Для функции, заданной табл. V.1, построим интерполяционный многочлен Ln(x), степень которого не выше п и выполнены условия (V.1).

Будем искать Ln (x) в виде

Ln(x) = lo(x) + l1(x) + … + ln (x) ,

(V.5)

где li – многочлен степени n, причем

 

li (xk) =

yi , если i = к

 

.

(V.6)

0, если i ≠ к

Очевидно, что требование (V.6) с учетом (V.5) обеспечивают выполнение условий (V.1).

Многочлены li ,(x) составим следующим образом:

li (x)=ci (x –x0)(x - xi) · …· (x – xi-1)(x – xi+1)· …·(x - xn), (V.7)

где сi— постоянный коэффициент, значение которого находится из первой части условия (V.6):

сi

 

 

yi

,

(V.8)

(xi x0 )

(xi xi 1)(xi xi 1) (xi xn )

 

 

 

 

Подставивс, в(V.7) идалеев(V.5), окончательнополучим:

 

 

n

 

(x x0 ) (x xi 1) (x xi 1) (x xn )

 

Ln (x) yi

 

. (V.9)

 

(xi x0 ) (xi xi 1)(xi xi 1) (xi xn )

 

i 0

 

 

Формула (V.9) решает поставленную задачу.

Пример V.2. Решить, используя пакет MATLAB, задачу интерполяции с помощью многочлена Лагранжа для функции f(x) = sin(x), заданной таблично в восьми точках на интервале [0, 2π].

1. Задайте табличные значения интерполируемой функции.

113

»N=8;

»i = 1:N;

»x(i)= 2*pi/(N-1)*(i-1);

»y=sin(x);

2. Создайте файл Lagrange.m (листинг V.3), содержащий описание функции возвращающей значение многочлена li ,(x).

function z=Lagrange (x, i , X, Y)

%x - абсцисса точки интерполяции

%I - номер полинома Лагранжа

%X - вектор, содержащий абсциссы узлов интерполяции

%Y - вектор, содержащий ординаты точек интерполяции

N=length(X);

L=l;

for j=l:N

if not(j==i)

L=L*(x-X(j)) / (X(i)-X(j)); end;

end; z=L*Y(i);

3. Создайте файл Pol_Lagr.m (листинг V.4), содержащий описание функции, возвращающей значения полинома Лагранжа.

Листинг V.4 . Файл Lagr. m function z=Pol_I<agr(x,X,Y)

%x - абсцисса точки интерполяции

%i - номер полинома Лагранжа

%X - вектор, содержащий абсциссы узлов интерполяции

%Y - вектор, содержащий ординаты точек интерполяции

N=length(X); s=0,-

for i=l:N

s=s+Lagrange (x , i , X, Y ); end;

z=s;

114

4.Задайте число промежуточных точек, вычислите их координаты и точные значения интерполируемой функции. » М=1000;

» j=1:M;

» X(j) =2*pi / (M-1) * (j -1); » Y = sin (X)

5.Вычислите значения полинома Лагранжа в промежуточных точках.

» for j=l:M

Y2 ( j ) =Pol_Lagr (X ( j ) , x , у) ; end;

6.Постройте разность между точными и интерполированными значениями функции (рис. V.3).

Рис. V.3. Погрешность аппроксимации функции f (х) = sin (х) полиномом Лагранжа

115

5.3. Интерполяционный полином Ньютона для равноотстоящих узлов

Интерполяционные формулы Ньютона строятся для функций, заданных таблицами с равноотстоящими значениями аргумента h:

h = xi +1 – xi (i =1, 2, … , n )

(V.10)

5.3.1 . Конечныеразности

Для функции, заданной табл. V.1 с постоянным шагом (V.10), определим разности между значениями функции в соседних узлах интерполяции:

yi = yi +1 – yi . (V.11)

Такое выражение называют конечными разностями первого порядка. Из конечных разностей первого порядка можно образовать конечные разности второго порядка:

2yi = yi +1– yi=(yi +2–yi +1)–(yi +1–yi)=yi +2– 2yi +1+yi. (V.12)

Аналогично получают выражение для конечных разностей третьего порядка:

3yi = 2yi +1 2yi = (yi +3 – 2yi +2 + yi +1) – (yi +2 – 2yi +1 + yi) =

 

 

= yi +3 – 3yi +2 + 3yi +1 – yi .

(V.13)

Методом математической индукции можно доказать, что

k

 

k(k 1)

 

k

 

 

yi yi k kyi k 1

 

 

yi k 2 ( 1)

 

yi .

(V.14)

2!

 

5.3.2. Перваяинтерполяционнаяформула Ньютона

Будем искать интерполяционный полином в виде: 116

Pn (x) a0

a1(x x0 ) a2

(x x0 )(x x1)

(V.15)

an (x x0 ) (x xn 1)

 

Значения коэффициентов a0, a1, … , an найдем из условия совпадения значений исходной функции и многочлена в узлах. Полагая х = х0 , из (V.15) найдем у0 = P0(x0) = a0 , откуда а0 = у0. Далее, последовательно придавая х значения x1, и х2, получаем:

yi Pn (x1 ) a0 a1 (x1 x0 ) a0 a1h,

откуда

 

 

a y0

,

 

 

 

 

 

1

h

 

 

 

 

 

 

 

 

 

 

 

 

y2 Pn (x2 ) a0 a1 (x2 x0 ) a2 (x2 x0 )(x2 x1 )

a

0

a 2h a

2

2h2 .

 

 

т.е.

 

1

 

 

 

 

 

 

 

2h2 y

 

 

 

 

 

 

a

2

2

a 2h a

0

.

 

 

 

 

1

 

или 2ha

y

2

2 y

y

y

2

2(y

y

) y

y

2

2y

y

2 y

,

2

 

0

0

 

 

 

 

 

1

0

0

 

1

0

0

откуда

 

 

 

 

 

 

 

a2

 

2 y0

.

 

 

 

 

 

 

 

 

 

 

 

 

 

2!h2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Затем, проведя аналогичные действия, можно получить

 

 

 

 

 

 

 

a3

3 y0

 

 

 

 

 

 

 

 

 

 

 

 

 

3!h2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

В общем случае выражение для ак будет иметь вид

 

 

 

 

 

 

 

an

 

n y0

 

 

.

 

 

 

 

(V.16)

 

 

 

 

 

n!h2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

117