Sistemi nelinearnih jednačina

U ovom dokumentu ćemo razmatrati metode za rešavanje sistema jednačina oblika

gde su neke, u opštem slučaju, nelinearne funkcije. Sistem se može zapisati i u obliku

gde je , i . Funkcija se naziva vektorskom funkcijom.

Ugrađena MATLAB funkcija za rešavanje ovakvih problema je fsolve(), gde je vektorska funkcija kojom zadajemo jednačinu, a neka početna aproksimacija rešenja. Navedimo primer pozivanja za rešavanje sistema

uz početnu aproksimaciju rešenja (0.25,0.75):

F = @(x)[0.1*x(1).^2+x(1)+0.2*x(2).^2-0.3, 0.2*x(1).^2+x(2)-0.1*x(1).*x(2)-0.7];

x0 = [0.25,0.75];

x = fsolve(F,x0);

Equation solved.

fsolve completed because the vector of function values is near zero
as measured by the default value of the function tolerance, and
the problem appears regular as measured by the gradient.

<stopping criteria details>

disp(x);

   0.196411544201021   0.706154226309022

Određivanje oblasti u kojoj se nalazi rešenje i određivanje početne aproksimacije se često može najlakše odrediti grafičkom metodm. Pošto je svaka od jednačina u sistemu opisana implicitno, koristićemo ugrađenu funkciju fimplicit, gde je funkcija 2 promenljive i pravougaonik na kom nas zanima izgled grafika. Navedimo primer pozivanja te funkcije u službi prethodnog zadatka:

f1 = @(x,y)0.1*x.^2+x+0.2*y.^2-0.3;

f2 = @(x,y)0.2*x.^2+y-0.1*x.*y-0.7;

fimplicit(f1,[-5,5,-5,5]);

hold on

fimplicit(f2,[-5,5,-5,5]);

hold off

Podsetimo se Jakobijeve matrice funkcije u tački , koja će nam predstavljati svojevrsnu generalizaciju prvog izvoda iz jednodimenzionog slučaja:

Dve metode koje ćemo razmatrati i implementirati su metode rađene na časovima vežbi: Metoda iteracije i Metoda Njutn-Kantoroviča - obe metode koje generalizuju metode obrađene u temi nelinearnih jednačina u jednodimenzionom slučaju.

Metoda iteracije

Ova metoda prati standardnu ideju proste iteracije sa kojom smo se i ranije sretali: Transformišemo početni sistem u ekvivalentan sistem na oblasti koja sadrži rešenje:

odnosno u oblik . Sledeći korak je da formiramo iterativni proces

, gde je neko početno rešenje iz oblasti . Ovakav iterativni proces će konvergirati ako važi:

Kao i ranije, možemo odrediti apriornu i aposteriornu ocenu greške iterativnog procesa:

Iako je sama metode idejno veoma jednostavna, ono što predstavlja ponajveći problem je određivanje funkcija i parametra , i to je nešto što će se ostavljati korisniku da sam uradi. U tom smislu, sledeća implementacija samo vrši izračunavanje kroz iteracije, i određuje maksimalan broj iteracija koji garantuje navedenu tačnost. Pretpostavlja se da su svi ulazni parametri korektno odabrani.

% function x = IterationMethod(G,x0,q,tol)

% x1 = G(x0);

% k = ceil(log((tol*(1-q)/(norm(x1-x0,'inf'))))/log(q))-1; %broj iteracija koji garantuje tačnost

% xOld = x0;

% x = x1;

% disp('Rezultati kroz iteracije:');

% disp(x);

% for i=1:k

% if (norm(x-xOld,'inf')<(1-q)*tol/q)

% break

% end

% xOld = x;

% x = G(x);

% disp(x)

% end

% end

G = @(x)[-0.1*x(1).^2-0.2*x(2).^2+0.3, -0.2*x(1).^2+0.1*x(1).*x(2)+0.7];

x0 = [0.25,0.75];

q = 0.5;

tol = 1e-4;

x = IterationMethod(G,x0,q,tol)

Rezultati kroz iteracije:
   0.181250000000000   0.706250000000000
   0.196957031250000   0.706230468750000
   0.196368497785950   0.706151291218567
   0.196414012089799   0.706154469442078
x =
   0.196414012089799   0.706154469442078

Metoda Njutn-Kantoroviča

Metoda se zasniva na iterativnom procesu

za neko početno rešenje iz oblasti . U realnom problemu (sa većim dimenzijama), odmah bi se uočilo da je računanje inverza matrice u svakoj iteraciji vremenski zahtevno (a ne treba zanemariti i numerilčke probleme koji mogu nastati sa računanjem inverza). Zato se ponekad koristi i sledeća modifikacija

koja je teorijski svakako dosta manje precizna od osnovne verzije.

Za kriterijum zaustavljanja ćemo uzeti , gde je zadata tačnost.

Ono što će biti novina u odnosu na prethodnu i sve ostale teme koje su obrađivane je korišćenje simboličkog paketa koji nudi MATLAB. Definisanjem simboličkih promenljivih i funkcija je moguće određivati izvode funkcije, što nam je prvenstveno motivacija za korišćenje tog paketa. Uopšte, simboličko izračunavanje predstavlja drugačiju paradigmu u odnosu na numeričko izračunavanje i aktivan je predmet izučavanja u računarskoj nauci. Ono se zasniva na manipulaciji izraza na koju smo mi kroz školovanje i navikli kad ,,ručno'' rešavamo matematičke zadatke.

Videćemo da je moguće simboličke funkcije u MATLAB-u pretvoriti u ,,standardne'' (anonimne) funkcije i obrnuto.

syms x y z f

f(x,y,z) = x^2*sin(y*z)+cos(x^2+y)*z %definisanje proizvoljne simboličke funkcije tri promenljive

f(x, y, z) =

fx(x,y,z) = diff(f,x) %izvod funkcije f po x

fx(x, y, z) =

a = f(1,2,3)

a =

double(a) %određivanje numeričke vrednosti za a

ans =
  -3.249392988000262

F = matlabFunction(f) %pretvaranje simboličke u anonimnu funkciju

F =
    @(x,y,z)z.*cos(y+x.^2)+x.^2.*sin(y.*z)

f(x,y,z) = sym(F) %pretvaranje anonimne u simboličku funkciju

f(x, y, z) =

Navedimo kako možemo odrediti Jakobijevu matricu vektoske funkcije:

syms x y f1 f2 F JF

f1(x,y) = x+y^2;

f2(x,y) = x*sin(y);

F(x,y) = [f1;f2];

JF(x,y) = jacobian(F) %ugrađena funkcija, argument mora biti vektor

JF(x, y) =

U nastavku je data implementacija metode Njutn-Kantoroviča, na primeru sa časa:

% function x = NewtonKantorovich(F,x0,tol)

% Fsym = sym(F);

% JFsym = jacobian(Fsym);

% disp(JFsym); %Jakobijeva matrica

% JF = matlabFunction(JFsym);

% xOld = x0;

% x = xOld - (JF(xOld(1),xOld(2)))\F(xOld(1),xOld(2)); %MATLAB preporučuje A\b umesto inv(A)*b

% disp('Rezultati kroz iteracije:');

% disp(x');

% while (norm(x-xOld,'inf')>=tol)

% xOld = x;

% x = xOld - (JF(xOld(1),xOld(2)))\F(xOld(1),xOld(2));

% disp(x');

% end

% end

F = @(x,y)[x.^2-2*log10(y)-1;x.^2-x.*y+1];

x0 = [1.5;2];

tol = 1e-9;

x = NewtonKantorovich(F,x0,tol)

Rezultati kroz iteracije:
   1.287653978211292   2.025102652140861
   1.275796468051532   2.059193500338645
   1.275762067874896   2.059607276761220
   1.275762062173482   2.059607286647649
   1.275762062173481   2.059607286647649
x =
   1.275762062173481
   2.059607286647649