Мария Николова (предстои допълване на темите, превеждане на английския текст и добавяне на литературните източници)


Екстремум на функция. Числено интегриране



страница7/10
Дата19.03.2017
Размер0.69 Mb.
#17331
1   2   3   4   5   6   7   8   9   10

Екстремум на функция. Числено интегриране





  1. Минимизация на функции

FMINBND – прилага се за минимизация на функции. Начини на използване:

X = FMINBND(FUN,x1,x2) намира локален минимум на Х на функцията FUN в интервала x1 <= X <= x2. FUN може да се зададе в m-файл като функция или като функция в inline обект.

X = FMINBND(FUN,x1,x2,OPTIONS) намира минимум с параметри, зададени в опцията OPTIONS, създадени с функцията OPTIMSET.

Примери: Да се намери минимумът на функцията x3-2.x-5



  1. Изчертава се графиката на функцията за да се уточни интервала, където функцията има минимум - може с ezplot, както е показано по-долу

>> syms x y

>> y=x^3-2*x-5

y =

x^3-2*x-5



>> ezplot(y)

Вижда се, че минимумът на функцията може да се търси в [0, 2]. За по-лесно установяване на минимума трябва да се избере Tools/Data Cursor и да се кликне върху минимума на графиката (приблизително) за да се визуализират стойността на х, за която функцията има минимум и стойността на y, която представлява приблизителния минимум на функцията. По аналогичен начин се намира приблизителния максимум.


2. Дефинира се функцията y по един от двата начина: във файл или като анонимна функция, използваща @. За версии на Матлаб преди 2013, функцията може да се дефинира и като inline обект.

3. Извикваме функцията FMINBND за търсене на минимум в интервала ( в случая [0, 2]) и намираме стойността на х, за която функцията има минимум – нека тази стойност е xmin

4. Намираме стойността на минимума ymin като извикаме функцията f с аргумент получената стойност за xmin, т.e. ymin=f(xmin)
I начин: чрез анонимна функция:

>> y=@(x) x^3-2*x-5

y =

@(x)x^3-2*x-5


>> xmin=fminbnd(y,0,2)

xmin =


0.8165
>> ymin=y(xmin)

ymin =


-6.0887
II начин: Създаване на файл f.m със следното съдържание

function y=f(x)

y=x^3-2*x-5
След записването на файла, извикваме fminbnd.

>> xmin=fminbnd('f',0,2)

y =

-6.0820


y =

-5.5836


y =

-5.8390


y =

-6.0865


y =

-6.0885


y =

-6.0887


y =

-6.0887


y =

-6.0887


y =

-6.0887


y =

-5

y =



-1

xmin =


0.8165

>> ymin=f(xmin)

y =

-6.0887


ymin =

-6.0887


III начин за версии на Матлаб преди 2013– дефинира се функцията y като inline обект по следния начин:

>> y=inline(x^3-2*x-5)

y =

Inline function:



y(x) = x.^3-2.*x-5
Извиква се FMINBND за търсене на минимум в интервала [0, 2]

>> xmin= fminbnd (y,0,2)

xmin =

0.8165


Намираме стойността на минимума като извикаме функцията y с аргумент получената стойност за xmin

>> ymin=y(xmin)

ymin =

-6.0887


>>
Ако имаме функция на 2 променливи, тя се дефинира така:

>> f=@(x,y) y*sin(x)+x*cos(y)

f =

@(x,y)y*sin(x)+x*cos(y)


или за по-стара версия:

>>f= inline('y*sin(x)+x*cos(y)','x','y')

Inline function:

f =


f(x,y) = y*sin(x)+x*cos(y)
Получаване на стойност на такава функция – задават се стойности на x и y:

>> f(pi,2*pi)

ans =

3.1416
Максимум на функция f може да се намери като:



  1. Функцията f се зададе обратна (със знак минус)

  2. Извиква се fminbnd за намиране на стойността на x, за която функцията има максимум. Нека тази стойност е maxx.

  3. За да се получи максимумът (нека това да е променлива maxf), трябва да се замести в f полученият аргумент maxx като: f(maxх)

или

в реалната функция на мястото на х (това е израза за функцията без знак минус).


Пример: Да се намери максимума на функцията x^3-2*x-5 в интервала [-2,0]
>> ezplot('x^3-2*x-5')
>> f=@(x) -(x^3-2*x-5)

f =


@(x)-(x^3-2*x-5)
>> maxx=fminbnd(f,-2,0)

maxx =


-0.8165
>> maxf=-f(maxx)

maxf =


-3.9113
Максимумът на функцията е -3.9113.



  1. Числено интегриране.

    1. Използване на Toolbar Symbolics Math (символно интегриране) – функция int

Ако f е символен израз, тогава int(f) се опитва да намери друг символен израз F, така че производната diff(F) = f. Ако се налага интегриране по друга променлива напр. v, а не х, тогава се използва int(f,v). Определен интеграл се пресмята като след функцията f (или след името на променливата на интегриране, ако тя е различна от х) се зададат стойностите на границите на интегриране –напр. int(f,a,b), където а и b са съответно долната и горната граници на интегриране .

Примери: Да се намери интеграл от sin(x) в границите 0-2*pi; 0-pi;/2 0-pi

>> syms x

>> int(sin(x),0,2*pi)

ans =

0

>> int(sin(x),0,pi/2)



ans =

1

>> int(sin(x),0,pi)



ans =

2

Пример за интегриране на в граници от 0 до 1.



>> f=1/sqrt(x)

f =


1/x^(1/2)

>> int(f,0,1)

ans =

2


    1. Използване на квадратурни формули

Ако не можем да изчислим интеграла символно или се налага да използваме двоен или троен интеграл, тогава използваме формули за числено интегриране, които се наричат квадратурни формули. Общата идея е приближената стойност да се пресметне като сума от стойности на подинтегралната функция f(хк), пресметнати в някакви точки хк, наречени възли и умножени с коефициенти Ак , наречени тегла (или тегловни коефициенти). Възлите и тегловните коефициенти не зависят от функцията. Според начина на избор на възлите и тегловните коефициенти се получават различни типове квадратурни формули.
Пример: да се интегрира функцията в граници от 0 до 2.

I начин: В по-новите версии на Матлаб - с функция integral:

>> fun=@(x) 1./(x.^3-2.*x-5)

fun =

@(x)1./(x.^3-2.*x-5)



>> integral(fun,0,2)

ans =


-0.4605
Обърнете внимание на точките преди умножение, деление и степенуване при въвеждане на функцията!
II начин: В по-старите версии на Матлаб - с функция quad:

Ако функцията се зададе като inline обект:

>> F = inline('1./(x.^3-2.*x-5)');

Интегрирането се извършва по следния начин:

>> Q = quad(F,0,2)

Q =


-0.4605

Използваните квадратурни формули в Matlab са: quad – използва адаптивна квадратура на Симпсон; quad1 (накрая има буква l, a не числото 1)– използва адаптивна квадратура на Gauss/Lobatto; dblquad – числено решаване на двоен интеграл; triplequad – числено решаване на троен интеграл. В изложението по-долу са дадени синтаксиса и примери на използване на функциите за интегриране, които се използват най-често. Повече подробности по приложението на функциите за числено интегриране може да се прочетат в помощната програма на Matlab.

Най-често използване на quad:

I начин: q = quad(fun,a,b)

където fun е подинтегралната функция, която може да се зададе като inline-функция или да се запише в m-файл; а и b са стойностите на долната и горната граница съответно. Грешката на изчисление е 10-6. q – резултат от интегрирането.

II начин: q = quad(fun,a,b,tol)

tol – задаване на точност, ако потребителят е неудовлетворен от точността по подразбиране10-6

Функцията quad1 може да се използва за изчисление с по-голяма точност и за гладки функции.


Използване на функцията quad като се задава стойност на грешката 0.001 при пресмятане: Вижда се, че полученият резултат се отличава от предходния – това се дължи на въведената по-малка точност на пресмятане.

>> Q = quad(F,0,2,1e-3)

Q =

-0.4628


> Q = quad(F,0,2,1e-3,1)

9 0.0000000000 5.43160000e-001 -0.0989460227

11 0.5431600000 9.13680000e-001 -0.1584111746

13 1.4568400000 5.43160000e-001 -0.2054245169

Q =

-0.4628
Бележки по въвеждане на inline – функцията:



Ако преди командата inline, променливата х е зададена символно чрез:

>>syms x

тогава F може да се дефинира без апострофи и точки пред умножение, деление и степенуване, тоест:

>>F=inline(1/(x^3-2*x-5)

Matlab автоматично преобразува функцията с точки пред умножение, деление и степенуване.

След това се въвежда функцията за интегрирането quad. Например

>> Q = quad(F,0,2)



Ако обаче променливата х не е символна, трябва F да се въведе с апострофи и точки пред умножение, деление и степенуване. Тогава F ще има вида:

>>F=inline(1./(x.^3-2.*x-5)

Ако функцията се зададе във файл f1.m със следното съдържание:

function y=f1(x)

y=1./(x.^3-2.*x-5)


Да се обърне внимание на операциите – те са поелементни – има точка пред знака за деление, степенуване и умножение!

Тогава интегрирането може да се извърши по един от следните 2 начина:

Q = quad(@f1,0,2) или Q = quad('f1',0,2). И в двата случая резултатът е:

y =


-0.2000 -0.1811 -0.1687 -0.1667 -0.2074 -0.3036 -1.0000

y =


-0.1898 -0.1740

y =


-0.1644 -0.1785

y =


-0.1658 -0.1646

y =


-0.1711 -0.1899

y =


-0.1686 -0.1743

y =


-0.1836 -0.1977

y =


-0.2412 -0.4445

y =


-0.2220 -0.2672

y =


-0.2142 -0.2309

y =


-0.2532 -0.2838

y =


-0.3576 -0.6055

y =


-0.3278 -0.3954

y =


-0.5109 -0.7504

y =


-0.4750 -0.5537

y =


-0.6694 -0.8562

y =


-0.6357 -0.7074

y =


-0.7995 -0.9221

Q =


-0.4605

Използването на quad1 е по аналогичен на описания по-горе начин за функцията quad. Същият пример с използването на функция quad1:

>> F = inline('1./(x.^3-2*x-5)')

>> Q = quadl(F,0,2)

Q =

-0.4605
Намиране на двоен интеграл



Първи начин:

>> f=@(x,y) (y.*sin(x)+x.*cos(y))

f =

@(x,y)(y.*sin(x)+x.*cos(y))



>> integral2(f,pi,2*pi,0,pi)

ans =


-9.8696
Втори начин:

Най-често използване на dblquad:

I начин: q = dblquad(fun,xmin,xmax,ymin,ymax)

II начин: q = dblquad(fun,xmin,xmax,ymin,ymax,tol)

където fun(x,y) е подинтегрална функция на 2 променливи в правоъгълната област xmin <= x <= xmax, ymin <= y <= ymax и се задава по начина, описан по-горе за функцията quad. fun(x,y)трябва да приеме вектор х и скалар y и връща вектор от стойности за подинтегралния израз. Грешката на пресмятане (толерансът) tol по подразбиране е 10-6.

Пример: Да се пресметне интегралът

I начин: Задаване на fun(x,y) като inline-функция:

>> F=inline('y*sin(x)+x*cos(y)')

F =

Inline function:



F(x,y) = y*sin(x)+x*cos(y)

Стартиране на dblquad

>> Q = dblquad(F, pi, 2*pi, 0, pi)

Q =


-9.8696
II начин: Задаване на fun(x,y) като функция в m-файл с име integr.m

function z = integr(x, y)

z = y*sin(x)+x*cos(y);

Стартиране на dblquad

>> Q = dblquad(@integr, pi, 2*pi, 0, pi)

Q =


-9.8696
Намиране на троен интеграл

Първи начин:

>> f=@(x,y,z) y.*sin(x)+z.*cos(x)

f =

@(x,y,z)y.*sin(x)+z.*cos(x)



>> integral3(f,0,pi,0,1,-1,1)

ans =


2.0000
Втори начин - използване на triplequad:

I начин: triplequad(fun,xmin,xmax,ymin,ymax,zmin,zmax)

II начин: triplequad(fun,xmin,xmax,ymin,ymax,zmin,zmax,tol)
>> Q = triplequad(inline('y*sin(x)+z*cos(x)'),0,pi,0,1,-1,1)

Q =


2.0000



Сподели с приятели:
1   2   3   4   5   6   7   8   9   10




©obuch.info 2024
отнасят до администрацията

    Начална страница