(%i1) load(draw)$

Numeričko traženje ekstrema

Traženje ekstrema s teorijske strane je riješen problem. Međutim, u praksi se mogu javiti komplicirani sustavi koje nije moguće egzaktno riješiti kako bismo dobili stacionarne točke. U tom slučaju moramo upotrijebiti neku numeričku metodu. Ovdje nećemo ulaziti u detalje tih metoda niti ćemo ih spominjati jer to prelazi okvire ovog predmeta. Na jednom jednostavnom primjeru pokazat ćemo situaciju u kojoj možemo naići na određene poteškoće koje su više vezane uz samu Maximu, iako se ručnim rješavanjem ekstremi mogu egzaktno pronaći.

 1 Zadatak

Odredite ekstreme funkcije f(x,y)=4x+3y+7 uz uvjet x^4.24*y^3.91=18.

 1.1 Rješenje (1. način)

Iz uvjeta možemo izraziti jednu varijablu pomoću druge pa problem svodimo na traženje ekstrema funkcije jedne varijable

(%i2) f(x,y):=4·x+3·y+7;
(%o2)	f(x,y):=4*x+3*y+7

Kako je opća potencija (koja se javlja u uvjetu) definirana za pozitivne brojeve, možemo pretpostaviti da su varijable x i y pozitivne.

(%i3) assume(x>0,y>0);
(%o3)	[x>0,y>0]

Maxima zna iz zadanog uvjeta jednu varijablu izraziti pomoću druge, no problem je što ona jednadžbu rješava u skupu kompleksnih brojeva pa na izlazu daje 391 moguće rješenje. Rješenja nisu namjerno ispisana zbog uštede prostora (zato je stavljen znak dolara na kraju naredbe).

(%i4) rj:solve(x^4.24·y^3.91=18,y)$
rat: replaced 4.24 by 106/25 = 4.24<BR>
rat: replaced 3.91 by 391/100 = 3.91
(%i5) length(rj);
(%o5)	391

U ovom slučaju ovaj problem možemo lagano izbjeći tako da jednadžbu rješavamo numeričkim putem i u tom slučaju dobivamo samo jedno realno rješenje kao što bismo dobili i ručnim rješavanjem jednadžbe.

(%i6) rj:solve(x^4.24·y^3.91=18,y),numer;
rat: replaced 4.24 by 106/25 = 4.24<BR>
rat: replaced 3.91 by 391/100 = 3.91<BR>
rat: replaced 4.24 by 106/25 = 4.24<BR>
rat: replaced 3.91 by 391/100 = 3.91<BR>
rat: replaced 4.24 by 106/25 = 4.24<BR>
rat: replaced 3.91 by 391/100 = 3.91<BR>
rat: replaced 3.91 by 391/100 = 3.91<BR>
rat: replaced -2.094312869232618 by -25974885/12402581 = -2.094312869232622<BR>
rat: replaced -1.084398976982097 by -424/391 = -1.084398976982097<BR>
rat: replaced -2.094312869232622 by -25974885/12402581 = -2.094312869232622<BR>
rat: replaced 0.806283788833953e-7 by 1/12402581 = 0.806283788833953e-7<BR>
rat: replaced -1.084398976982097 by -424/391 = -1.084398976982097<BR>
rat: replaced -2.094312869232622 by -25974885/12402581 = -2.094312869232622
(rj)	[y=2.094312869232622/x^1.084398976982097]
(%i7) rj[1];
(%o7)	y=2.094312869232622/x^1.084398976982097
(%i8) rhs(rj[1]);
(%o8)	2.094312869232622/x^1.084398976982097
(%i9) y0:rhs(rj[1]);
(y0)	2.094312869232622/x^1.084398976982097

Dobiveno rješenje uvrstimo u početnu funkciju f i dobivamo funkciju jedne varijable.

(%i10) fun:f(x,y0);
(fun)	4*x+6.282938607697865/x^1.084398976982097+7

Tražimo stacionarne točke dobivene funkcije jedne varijable. Jednadžbu rješavamo ponovo numeričkim putem kako bismo izbjegli ranije navedene probleme.

(%i11) der:diff(fun,x);
(der)	4-6.813212198628887/x^2.084398976982097
(%i12) stac:solve(der=0,x),numer;
rat: replaced -6.813212198628887 by -45304911/6649567 = -6.813212198628873<BR>
rat: replaced -2.084398976982097 by -815/391 = -2.084398976982097<BR>
rat: replaced -6.813212198628873 by -45304911/6649567 = -6.813212198628873<BR>
rat: replaced -1.503857318829933e-7 by -1/6649567 = -1.503857318829933e-7<BR>
rat: replaced -2.084398976982097 by -815/391 = -2.084398976982097<BR>
rat: replaced -2.084398976982097 by -815/391 = -2.084398976982097<BR>
rat: replaced -2.084398976982097 by -815/391 = -2.084398976982097<BR>
rat: replaced -2.084398976982097 by -815/391 = -2.084398976982097<BR>
rat: replaced -1.291110356438729 by -66182211/51259918 = -1.291110356438729<BR>
rat: replaced -1.291110356438729 by -61159997/47370077 = -1.291110356438728<BR>
rat: replaced 2.111037311592295e-8 by 1/47370077 = 2.111037311592295e-8<BR>
rat: replaced -1.291110356438728 by -61159997/47370077 = -1.291110356438728
(stac)	[x=1.291110356438728]
(%i13) x0:rhs(stac[1]);
(x0)	1.291110356438728

U slučaju kompliciranijih jednadžbi možemo koristiti naredbu find_root koja zahtijeva da pogodimo neki dovoljno mali interval koji sadrži nultočku. U većini situacija to možemo pogoditi pomoću slike tako da funkciju crtamo unutar nekog intervala tako dugo dok graf ne presječe x-os.

(%i14) wxplot2d(der,[x,0.8,5]);
(%t14)
 (Graphics)
(%o14)

Vidimo sa slike da je nultočka sigurno npr. unutar segmenta [1,3]

(%i15) x0:find_root(der,1,3);
(x0)	1.29111035643873

Kako je druga derivacija u stacionarnoj točki pozitivna, u pripadnoj stacionarnoj točki x0=1.29111035643873 funkcija postiže minimum koji je u ovom slučaju ujedno i globalni.

(%i16) der2:diff(fun,x,2);
(der2)	14.201452536784/x^3.084398976982097
(%i17) subst(x0,x,der2);
(%o17)	6.4576942368629

Iz uvjeta y0 izračunamo vrijednost druge varijable.

(%i18) y0:subst(x0,x,y0);
(y0)	1.587497325055168

Funkcija f(x,y)=4x+3y+7 uz uvjet x^4.24*y^3.91=18 postiže uvjetni globalni minimum u točki (x0,y0)=(1.29111035643873,1.587497325055168) i taj minimum iznosi 16.92693340092043.

(%i19) f(x0,y0);
(%o19)	16.92693340092043

1.2 Rješenje (2. način)

pomoću Lagrangeove funkcije

(%i20) L(x,y,t):=f(x,y)+t·(x^4.24·y^3.9118);
(%o20)	L(x,y,t):=f(x,y)+t*(x^4.24*y^3.91-18)
(%i21) L(x,y,t);
(%o21)	t*(x^4.24*y^3.91-18)+3*y+4*x+7
(%i22) Lx:diff(L(x,y,t),x);
(Lx)	4.24*t*x^3.24*y^3.91+4
(%i23) Ly:diff(L(x,y,t),y);
(Ly)	3.91*t*x^4.24*y^2.91+3
(%i24) Lt:diff(L(x,y,t),t);
(Lt)	x^4.24*y^3.91-18

Maxima ne zna riješiti dobiveni sustav, iako se on može ručno lagano riješiti. Stoga trebamo maximi malo pomoći.

(%i25) solve([Lx=0,Ly=0,Lt=0],[x,y,t]);
rat: replaced 4.24 by 106/25 = 4.24<BR>
rat: replaced 3.91 by 391/100 = 3.91
(%o25)	[]

Iz prve dvije jednadžbe možemo lagano eliminirati varijablu t (dodatni parametar koji smo uveli u Lagrangeovoj funkciji).

(%i26) el:eliminate([Lx=0,Ly=0],[t]);
rat: replaced 4.24 by 106/25 = 4.24<BR>
rat: replaced 3.91 by 391/100 = 3.91
(el)	[100*(318*x^3.24*y^3.91-391*x^4.24*y^2.91)]
(%i27) el[1];
(%o27)	100*(318*x^3.24*y^3.91-391*x^4.24*y^2.91)

Iz treće jednadžbe možemo dobiti eksplicitnu vezu između nepoznanica x i y. Nakon toga tu vezu uvrstimo u gornju jednadžbu el[1].

(%i28) rj:solve(Lt=0,y),numer;
rat: replaced 4.24 by 106/25 = 4.24<BR>
rat: replaced 3.91 by 391/100 = 3.91<BR>
rat: replaced 4.24 by 106/25 = 4.24<BR>
rat: replaced 3.91 by 391/100 = 3.91<BR>
rat: replaced 4.24 by 106/25 = 4.24<BR>
rat: replaced 3.91 by 391/100 = 3.91<BR>
rat: replaced 3.91 by 391/100 = 3.91<BR>
rat: replaced -2.094312869232618 by -25974885/12402581 = -2.094312869232622<BR>
rat: replaced -1.084398976982097 by -424/391 = -1.084398976982097<BR>
rat: replaced -2.094312869232622 by -25974885/12402581 = -2.094312869232622<BR>
rat: replaced 0.806283788833953e-7 by 1/12402581 = 0.806283788833953e-7<BR>
rat: replaced -1.084398976982097 by -424/391 = -1.084398976982097<BR>
rat: replaced -2.094312869232622 by -25974885/12402581 = -2.094312869232622
(rj)	[y=2.094312869232622/x^1.084398976982097]
(%i29) rj[1];
(%o29)	y=2.094312869232622/x^1.084398976982097

Dobivamo jednadžbu s jednom nepoznanicom koju rješavamo numeričkim putem.

(%i30) jed:subst(rj[1],el[1]);
(jed)	100*(5724.000000000039/x^1.0-3360.529414393965*x^1.084398976982097)

Međutim solve naredba numeričkim putem ne daje rješenje jer joj je zapis jednadžbe u nezgodnom obliku.

(%i31) solve(jed=0,x),numer;
rat: replaced 5724.000000000039 by 146362896682021/25570037855 = 5724.000000000039<BR>
rat: replaced -1.0 by -1/1 = -1.0<BR>
rat: replaced -3360.529414393965 by -977389817/290844 = -3360.52941439397<BR>
rat: replaced 1.084398976982097 by 424/391 = 1.084398976982097<BR>
rat: replaced 5724.000000000039 by 146362896682021/25570037855 = 5724.000000000039<BR>
rat: replaced -3360.52941439397 by -977389817/290844 = -3360.52941439397<BR>
rat: replaced -1.344647720999132e-14 by -4/297475683595985 = -1.344647720999132e-14<BR>
rat: replaced -1.0 by -1/1 = -1.0<BR>
rat: replaced 1.084398976982097 by 424/391 = 1.084398976982097<BR>
rat: replaced -1.0 by -1/1 = -1.0<BR>
rat: replaced 1.084398976982097 by 424/391 = 1.084398976982097<BR>
rat: replaced -1.0 by -1/1 = -1.0<BR>
rat: replaced 1.084398976982097 by 424/391 = 1.084398976982097
(%o31)	[x^1.084398976982097=1.703303049657219/x]

Možemo jednadžbu pomnožiti s x pa dobivamo novu ekvivalentnu jednadžbu koju maxima zna riješiti.

(%i32) jed2:expand(jed·x);
(jed2)	572400.000000004-336052.9414393965*x^2.084398976982097
(%i33) x0:solve(jed2=0,x),numer;
rat: replaced 572400.000000004 by 144614075274001/252645135 = 572400.000000004<BR>
rat: replaced -336052.9414393965 by -9623548084/28637 = -336052.9414393966<BR>
rat: replaced 2.084398976982097 by 815/391 = 2.084398976982097<BR>
rat: replaced 572400.000000004 by 144614075274001/252645135 = 572400.000000004<BR>
rat: replaced -336052.9414393966 by -9623548084/28637 = -336052.9414393966<BR>
rat: replaced -1.382170249340837e-13 by -1/7234998730995 = -1.382170249340837e-13<BR>
rat: replaced 2.084398976982097 by 815/391 = 2.084398976982097<BR>
rat: replaced 2.084398976982097 by 815/391 = 2.084398976982097<BR>
rat: replaced 2.084398976982097 by 815/391 = 2.084398976982097<BR>
rat: replaced 2.084398976982097 by 815/391 = 2.084398976982097<BR>
rat: replaced -1.29111035643873 by -86271067/66819282 = -1.29111035643873<BR>
rat: replaced -1.29111035643873 by -86271067/66819282 = -1.29111035643873<BR>
rat: replaced 1.496573997906772e-8 by 1/66819282 = 1.496573997906772e-8<BR>
rat: replaced -1.29111035643873 by -81248853/62929441 = -1.29111035643873
(x0)	[x=1.29111035643873]
(%i34) x0[1];
(%o34)	x=1.29111035643873
(%i35) x0:rhs(x0[1]);
(x0)	1.29111035643873

Ili možemo na početnoj jednadžbi koristiti naredbu find_root kojoj ne smeta početni zapis. Naravno, opet moramo pomoću slike otkriti neki interval unutar kojeg se nalazi nultočka pripadne funkcije.

(%i36) wxplot2d(jed,[x,0.8,5]);
(%t36)
 (Graphics)
(%o36)
(%i37) x0:find_root(jed,1,3);
(x0)	1.29111035643873

Izračunamo drugu varijablu iz uvjeta rj[1].

(%i38) rj[1];
(%o38)	y=2.094312869232622/x^1.084398976982097
(%i39) y0:subst(x0,x,rhs(rj[1]));
(y0)	1.587497325055168

Ponovo smo dobili istu stacionarnu točku x0=1.29111035643873, y0=1.587497325055168. No, u ovom slučaju ne znamo postiže li se u toj točki uopće uvjetni ekstrem i ako se postiže je li minimum ili maksimum.
Uvjet x^4.24*y^3.91=18 nije kompaktni skup u ravnini, što možemo vidjeti na slici, a iz same jednadžbe je jasno da pripadna krivulja nije omeđena.

(%i40) wxdraw2d(grid=true,color=red,line_width=2,xlabel="x",ylabel="y",
   ip_grid_in=[10,10],xrange=[0,5],yrange=[0,5],
implicit(x^4.24·y^3.91=18,x,0.4,5,y,0.3,5));
rat: replaced 3.91 by 391/100 = 3.91<BR>
rat: replaced 4.24 by 106/25 = 4.24
(%t40)
 (Graphics)
(%o40)

Stoga moramo provesti daljnja ispitivanja Lagrangeove funkcije. U tom slučaju trebamo i pripadnu vrijednost parametra t, kojeg možemo dobiti iz prve ili druge jednadžbe sustava jer vrijednosti od x i y sada znamo.

(%i41) Lx;
(%o41)	4.24*t*x^3.24*y^3.91+4
(%i42) jed3:subst([x=x0,y=y0],Lx);
(jed3)	59.11191062746484*t+4

Vrijednost parametra t

(%i43) t0:solve(jed3=0,t);
rat: replaced 59.11191062746484 by 162516435/2749301 = 59.11191062746494
(t0)	[t=-10997204/162516435]
(%i44) t0:rhs(t0[1]);
(t0)	-10997204/162516435

Sada odredimo sve parcijalne derivacije drugog reda Lagrangeove funkcije.

(%i45) hes:hessian(L(x,y,t),[x,y,t]);
(hes)	matrix(<BR>
		[13.7376*t*x^2.24*y^3.91,	16.5784*t*x^3.24*y^2.91,	4.24*x^3.24*y^3.91],<BR>
		[16.5784*t*x^3.24*y^2.91,	11.3781*t*x^4.24*y^1.91,	3.91*x^4.24*y^2.91],<BR>
		[4.24*x^3.24*y^3.91,	3.91*x^4.24*y^2.91,	0]<BR>
	)

Izračunamo Hesseovu determinantu u dobivenoj stacionarnoj točki (x0,y0,t0). Ako je ta determinanta strogo manja od nula, tada se radi o lokalnom minimumu, a ako je strogo veća od nule, tada se radi o lokalnom maksimumu.

(%i46) hes0:subst([x=x0,y=y0,t=t0],hes);
(hes0)	matrix(<BR>
		[-10.03787161598452,	-9.851985104577398,	59.11191062746484],<BR>
		[-9.851985104577398,	-5.499221864639432,	44.33393297059865],<BR>
		[59.11191062746484,	44.33393297059865,	0]<BR>
	)

Funkcija f(x,y)=4x+3y+7 uz uvjet x^4.24*y^3.91=18 postiže uvjetni lokalni minimum u točki (x0,y0)=(1.29111035643873,1.587497325055168) i taj minimum iznosi 16.92693340092043.
U ovom slučaju taj uvjetni minimum je ujedno i globalni ako pogledamo donju 3D sliku.

(%i47) determinant(hes0);
(%o47)	-12692.582605723
(%i48) f(x0,y0);
(%o48)	16.92693340092043

 2 3D slika

(%i49) wxdraw3d(xu_grid=30,yv_grid=30,surface_hide=false,
xlabel="x",ylabel="y",zlabel="f(x,y)",view=[70,30],
color=red,line_width=2,parametric(u,(18/u^4.24)^(1/3.91),0,u,0.3,5),
point_type=7,point_size=1.2,points([[x0,y0,0]]),
color=skyblue,line_width=1,explicit(f(x,y),x,0,5,y,0,7.7),
color=blue,line_width=2,parametric(u,(18/u^4.24)^(1/3.91),f(u,(18/u^4.24)^(1/3.91)),u,0.3,5),
points([[x0,y0,f(x0,y0)]]),user_preamble= "set xyplane at 0"),wxplot_size=[800,600];
(%t49)
 (Graphics)
(%o49)

Created with wxMaxima.