Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function [c, yc, OUT] = f_rfalsi(fun, a, b, k_max, tol)
- %%%%%%%%%%%%%%%%%%%%% ARGUMENTY %%%%%%%%%%%%%
- % fun - zadana funkcja
- % a,b - zakres przedzialu w ktorym miesci sie zero funkcji
- % k_max - maksymalna liczba iteracji
- % tol - zadana dokladnosc
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %<<<<<<<<<<<< ZWRACANE WARTOSCI <<<<<<<<<<<<<
- % c - przyblizenie pierwiastka
- % yc - wartosc funkcji dla znalezionego przyblizenia pierwiastka
- % OUT - pomocnicza tablica z wartosciami otrzymanymi w kolejnych krokach iteracji
- %<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
- % Copyright MB
- % Revision: 0.00 Date: March 05, 2011 Time: 04:48:50 PM
- % Matlab ver: 7.5.0.342 (R2007b) a -> b
- % Obliczenie wartosci funkcji na krancach przedzialu
- ya = eval([fun '(a)']) ; % <=> fun(a) ;
- yb = eval([fun '(b)']) ; % <=> fun(b) ;
- % Sprawdzenie czy funkcja ma rozne znaki na krancach przedzialu poczatkowego
- if (sign(ya) == sign(yb)) % if (ya*yb>0)
- error('Funkcja nie ma r��nych znak�w na ko�cach przedzia�u.')
- endif
- disp('Krok a b c yc blad') ;
- for ii=1:1:k_max
- %%% TODO >>>
- %%% Obliczenie kolejnego przyblizenia pierwiastka
- c = b - ( (b-a) /(yb - ya))*yb;
- %%%<<<<
- % Obliczenie wartosci funkcji dla ii-tego przyblizenia pierwiastka
- yc = eval([fun '(c)']) ; % fun1(c) ;
- blad = (b-a)/2 ;
- % Wyswietlenie informacji dotyczacych ii-tej iteracji
- out = [ii a b c yc blad];
- OUT(ii,:) = out ;
- % Sprawdzenie zbieznosci metody
- if (abs(yc) < tol)
- disp(['Metoda rfalsi zbie�na po ' num2str(ii) 'krokach.'])
- break ;
- endif
- % Wyznaczenie granic przedzialu dla kolejnej iteracji
- if (sign(ya) == sign(yc))
- % DLACZEGO NIE STOSUJEMY ya*yc>0 ?
- % tu odp: http://wazniak.mimuw.edu.pl/index.php?title=MN03LAB
- a = c ; ya = yc ;
- else
- %%% TODO >>>
- %%% Aktualizacja zmiennych b i yb
- b = c; yb = yc;
- %%%<<<<
- endif
- % Wyswietlenie komunikatu w przypadku gdy przyblizenia z zadana dokladnoscia
- % nie odnaleziono w zadanej maksymalnej liczbie iteracji
- if (ii >= k_max)
- disp('Nie odnaleziono zera funkcji z zadan� dokladnoscia.')
- endif
- endfor
- endfunction
- function [c, yc, OUT] = f_bisect(fun, a, b, k_max, tol)
- %%%%%%%%%%%%%%%%%%%%% ARGUMENTY %%%%%%%%%%%%%
- % fun - zadana funkcja
- % a,b - zakres przedzialu w ktorym miesci sie zero funkcji
- % k_max - maksymalna liczba iteracji
- % tol - zadana dokladnosc
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %<<<<<<<<<<<< ZWRACANE WARTOSCI <<<<<<<<<<<<<
- % c - przyblizenie pierwiastka
- % yc - wartosc funkcji dla znalezionego przyblizenia pierwiastka
- % OUT - pomocnicza tablica z wartosciami otrzymanymi w kolejnych krokach iteracji
- %<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
- % Copyright MB
- % Revision: 0.00 Date: March 05, 2011 Time: 04:48:50 PM
- % Matlab ver: 7.5.0.342 (R2007b) a -> b
- % Obliczenie wartosci funkcji na krancach przedzialu
- ya = eval([fun '(a)']) ; % <=> fun(a) ;
- yb = eval([fun '(b)']) ; % <=> fun(b) ;
- for ii=1:1:k_max
- %%% TODO >>>
- %%% Obliczenie kolejnego przyblizenia pierwiastka
- c = b - ( b-a)/(yb-ya)*b;
- %%%<<<<
- % Obliczenie wartosci funkcji dla ii-tego przyblizenia pierwiastka
- yc = eval([fun '(c)']) ; % fun1(c) ;
- blad = (b-a)/2 ;
- a = b;
- ya=yb;
- b = c;
- yb = yc;
- % Wyswietlenie informacji dotyczacych ii-tej iteracji
- out = [ii a b c yc blad];
- OUT(ii,:) = out ;
- % Sprawdzenie zbieznosci metody
- if (abs(yc) < tol)
- disp(['Metoda bisekcji zbie�na po ' num2str(ii) 'krokach.'])
- break ;
- endif
- % Wyswietlenie komunikatu w przypadku gdy przyblizenia z zadana dokladnoscia
- % nie odnaleziono w zadanej maksymalnej liczbie iteracji
- if (ii >= k_max)
- disp('Nie odnaleziono zera funkcji z zadan� dokladnoscia.')
- endif
- endfor
- endfunction
- function [c, yc, OUT] = f_bisect(fun, a, b, k_max, tol)
- %%%%%%%%%%%%%%%%%%%%% ARGUMENTY %%%%%%%%%%%%%
- % fun - zadana funkcja
- % a,b - zakres przedzialu w ktorym miesci sie zero funkcji
- % k_max - maksymalna liczba iteracji
- % tol - zadana dokladnosc
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %<<<<<<<<<<<< ZWRACANE WARTOSCI <<<<<<<<<<<<<
- % c - przyblizenie pierwiastka
- % yc - wartosc funkcji dla znalezionego przyblizenia pierwiastka
- % OUT - pomocnicza tablica z wartosciami otrzymanymi w kolejnych krokach iteracji
- %<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
- % Copyright MB
- % Revision: 0.00 Date: March 05, 2011 Time: 04:48:50 PM
- % Matlab ver: 7.5.0.342 (R2007b) a -> b
- % Obliczenie wartosci funkcji na krancach przedzialu
- ya = eval([fun '(a)']) ; % <=> fun(a) ;
- yb = eval([fun '(b)']) ; % <=> fun(b) ;
- % Sprawdzenie czy funkcja ma rozne znaki na krancach przedzialu poczatkowego
- if (sign(ya) == sign(yb)) % if (ya*yb>0)
- error('Funkcja nie ma r��nych znak�w na ko�cach przedzia�u.')
- endif
- for ii=1:1:k_max
- %%% TODO >>>
- %%% Obliczenie kolejnego przyblizenia pierwiastka
- c = (a+b)/2;
- %%%<<<<
- % Obliczenie wartosci funkcji dla ii-tego przyblizenia pierwiastka
- yc = eval([fun '(c)']) ; % fun1(c) ;
- blad = (b-a)/2 ;
- % Wyswietlenie informacji dotyczacych ii-tej iteracji
- out = [ii a b c yc blad];
- OUT(ii,:) = out ;
- % Sprawdzenie zbieznosci metody
- if (abs(yc) < tol)
- disp(['Metoda bisekcji zbie�na po ' num2str(ii) 'krokach.'])
- break ;
- endif
- % Wyznaczenie granic przedzialu dla kolejnej iteracji
- if (sign(ya) == sign(yc))
- % DLACZEGO NIE STOSUJEMY ya*yc>0 ?
- % tu odp: http://wazniak.mimuw.edu.pl/index.php?title=MN03LAB
- a = c ; ya = yc ;
- else
- %%% TODO >>>
- %%% Aktualizacja zmiennych b i yb
- b = c; yb = yc;
- %%%<<<<
- endif
- % Wyswietlenie komunikatu w przypadku gdy przyblizenia z zadana dokladnoscia
- % nie odnaleziono w zadanej maksymalnej liczbie iteracji
- if (ii >= k_max)
- disp('Nie odnaleziono zera funkcji z zadan� dokladnoscia.')
- endif
- endfor
- endfunction
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement