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);
disp(x);
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)
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
fx(x,y,z) = diff(f,x) %izvod funkcije f po x
a = f(1,2,3)
double(a) %određivanje numeričke vrednosti za a
F = matlabFunction(f) %pretvaranje simboličke u anonimnu funkciju
f(x,y,z) = sym(F) %pretvaranje anonimne u simboličku funkciju
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
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)