Advertisement
Guest User

matherfather

a guest
Dec 15th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.99 KB | None | 0 0
  1. function [c, yc, OUT] = f_rfalsi(fun, a, b, k_max, tol)
  2.  
  3. %%%%%%%%%%%%%%%%%%%%% ARGUMENTY %%%%%%%%%%%%%
  4. % fun - zadana funkcja
  5. % a,b - zakres przedzialu w ktorym miesci sie zero funkcji
  6. % k_max - maksymalna liczba iteracji
  7. % tol - zadana dokladnosc
  8. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  9. %<<<<<<<<<<<< ZWRACANE WARTOSCI <<<<<<<<<<<<<
  10. % c - przyblizenie pierwiastka
  11. % yc - wartosc funkcji dla znalezionego przyblizenia pierwiastka
  12. % OUT - pomocnicza tablica z wartosciami otrzymanymi w kolejnych krokach iteracji
  13. %<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  14.  
  15. % Copyright MB
  16. % Revision: 0.00 Date: March 05, 2011 Time: 04:48:50 PM
  17. % Matlab ver: 7.5.0.342 (R2007b) a -> b
  18.  
  19. % Obliczenie wartosci funkcji na krancach przedzialu
  20. ya = eval([fun '(a)']) ; % <=> fun(a) ;
  21. yb = eval([fun '(b)']) ; % <=> fun(b) ;
  22.  
  23. % Sprawdzenie czy funkcja ma rozne znaki na krancach przedzialu poczatkowego
  24. if (sign(ya) == sign(yb)) % if (ya*yb>0)
  25. error('Funkcja nie ma r��nych znak�w na ko�cach przedzia�u.')
  26. endif
  27.  
  28. disp('Krok a b c yc blad') ;
  29.  
  30. for ii=1:1:k_max
  31.  
  32. %%% TODO >>>
  33. %%% Obliczenie kolejnego przyblizenia pierwiastka
  34. c = b - ( (b-a) /(yb - ya))*yb;
  35. %%%<<<<
  36.  
  37. % Obliczenie wartosci funkcji dla ii-tego przyblizenia pierwiastka
  38. yc = eval([fun '(c)']) ; % fun1(c) ;
  39.  
  40. blad = (b-a)/2 ;
  41.  
  42. % Wyswietlenie informacji dotyczacych ii-tej iteracji
  43. out = [ii a b c yc blad];
  44. OUT(ii,:) = out ;
  45.  
  46. % Sprawdzenie zbieznosci metody
  47. if (abs(yc) < tol)
  48. disp(['Metoda rfalsi zbie�na po ' num2str(ii) 'krokach.'])
  49. break ;
  50. endif
  51.  
  52.  
  53. % Wyznaczenie granic przedzialu dla kolejnej iteracji
  54. if (sign(ya) == sign(yc))
  55. % DLACZEGO NIE STOSUJEMY ya*yc>0 ?
  56. % tu odp: http://wazniak.mimuw.edu.pl/index.php?title=MN03LAB
  57. a = c ; ya = yc ;
  58. else
  59. %%% TODO >>>
  60. %%% Aktualizacja zmiennych b i yb
  61. b = c; yb = yc;
  62. %%%<<<<
  63. endif
  64.  
  65. % Wyswietlenie komunikatu w przypadku gdy przyblizenia z zadana dokladnoscia
  66. % nie odnaleziono w zadanej maksymalnej liczbie iteracji
  67. if (ii >= k_max)
  68. disp('Nie odnaleziono zera funkcji z zadan� dokladnoscia.')
  69. endif
  70.  
  71. endfor
  72.  
  73. endfunction
  74.  
  75.  
  76.  
  77.  
  78.  
  79.  
  80.  
  81.  
  82.  
  83.  
  84.  
  85.  
  86.  
  87.  
  88.  
  89.  
  90.  
  91.  
  92.  
  93.  
  94.  
  95.  
  96.  
  97. function [c, yc, OUT] = f_bisect(fun, a, b, k_max, tol)
  98.  
  99. %%%%%%%%%%%%%%%%%%%%% ARGUMENTY %%%%%%%%%%%%%
  100. % fun - zadana funkcja
  101. % a,b - zakres przedzialu w ktorym miesci sie zero funkcji
  102. % k_max - maksymalna liczba iteracji
  103. % tol - zadana dokladnosc
  104. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  105. %<<<<<<<<<<<< ZWRACANE WARTOSCI <<<<<<<<<<<<<
  106. % c - przyblizenie pierwiastka
  107. % yc - wartosc funkcji dla znalezionego przyblizenia pierwiastka
  108. % OUT - pomocnicza tablica z wartosciami otrzymanymi w kolejnych krokach iteracji
  109. %<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  110.  
  111. % Copyright MB
  112. % Revision: 0.00 Date: March 05, 2011 Time: 04:48:50 PM
  113. % Matlab ver: 7.5.0.342 (R2007b) a -> b
  114.  
  115. % Obliczenie wartosci funkcji na krancach przedzialu
  116. ya = eval([fun '(a)']) ; % <=> fun(a) ;
  117. yb = eval([fun '(b)']) ; % <=> fun(b) ;
  118.  
  119.  
  120.  
  121. for ii=1:1:k_max
  122.  
  123. %%% TODO >>>
  124. %%% Obliczenie kolejnego przyblizenia pierwiastka
  125. c = b - ( b-a)/(yb-ya)*b;
  126. %%%<<<<
  127.  
  128. % Obliczenie wartosci funkcji dla ii-tego przyblizenia pierwiastka
  129. yc = eval([fun '(c)']) ; % fun1(c) ;
  130.  
  131. blad = (b-a)/2 ;
  132.  
  133. a = b;
  134. ya=yb;
  135.  
  136. b = c;
  137. yb = yc;
  138.  
  139. % Wyswietlenie informacji dotyczacych ii-tej iteracji
  140. out = [ii a b c yc blad];
  141. OUT(ii,:) = out ;
  142.  
  143. % Sprawdzenie zbieznosci metody
  144. if (abs(yc) < tol)
  145. disp(['Metoda bisekcji zbie�na po ' num2str(ii) 'krokach.'])
  146. break ;
  147. endif
  148.  
  149. % Wyswietlenie komunikatu w przypadku gdy przyblizenia z zadana dokladnoscia
  150. % nie odnaleziono w zadanej maksymalnej liczbie iteracji
  151. if (ii >= k_max)
  152. disp('Nie odnaleziono zera funkcji z zadan� dokladnoscia.')
  153. endif
  154.  
  155. endfor
  156.  
  157. endfunction
  158.  
  159.  
  160.  
  161.  
  162.  
  163.  
  164.  
  165.  
  166.  
  167.  
  168.  
  169.  
  170.  
  171.  
  172.  
  173.  
  174.  
  175.  
  176.  
  177.  
  178.  
  179.  
  180.  
  181.  
  182.  
  183.  
  184.  
  185.  
  186.  
  187. function [c, yc, OUT] = f_bisect(fun, a, b, k_max, tol)
  188.  
  189. %%%%%%%%%%%%%%%%%%%%% ARGUMENTY %%%%%%%%%%%%%
  190. % fun - zadana funkcja
  191. % a,b - zakres przedzialu w ktorym miesci sie zero funkcji
  192. % k_max - maksymalna liczba iteracji
  193. % tol - zadana dokladnosc
  194. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  195. %<<<<<<<<<<<< ZWRACANE WARTOSCI <<<<<<<<<<<<<
  196. % c - przyblizenie pierwiastka
  197. % yc - wartosc funkcji dla znalezionego przyblizenia pierwiastka
  198. % OUT - pomocnicza tablica z wartosciami otrzymanymi w kolejnych krokach iteracji
  199. %<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  200.  
  201. % Copyright MB
  202. % Revision: 0.00 Date: March 05, 2011 Time: 04:48:50 PM
  203. % Matlab ver: 7.5.0.342 (R2007b) a -> b
  204.  
  205. % Obliczenie wartosci funkcji na krancach przedzialu
  206. ya = eval([fun '(a)']) ; % <=> fun(a) ;
  207. yb = eval([fun '(b)']) ; % <=> fun(b) ;
  208.  
  209. % Sprawdzenie czy funkcja ma rozne znaki na krancach przedzialu poczatkowego
  210. if (sign(ya) == sign(yb)) % if (ya*yb>0)
  211. error('Funkcja nie ma r��nych znak�w na ko�cach przedzia�u.')
  212. endif
  213.  
  214.  
  215. for ii=1:1:k_max
  216.  
  217. %%% TODO >>>
  218. %%% Obliczenie kolejnego przyblizenia pierwiastka
  219. c = (a+b)/2;
  220. %%%<<<<
  221.  
  222. % Obliczenie wartosci funkcji dla ii-tego przyblizenia pierwiastka
  223. yc = eval([fun '(c)']) ; % fun1(c) ;
  224.  
  225. blad = (b-a)/2 ;
  226.  
  227. % Wyswietlenie informacji dotyczacych ii-tej iteracji
  228. out = [ii a b c yc blad];
  229. OUT(ii,:) = out ;
  230.  
  231. % Sprawdzenie zbieznosci metody
  232. if (abs(yc) < tol)
  233. disp(['Metoda bisekcji zbie�na po ' num2str(ii) 'krokach.'])
  234. break ;
  235. endif
  236.  
  237.  
  238. % Wyznaczenie granic przedzialu dla kolejnej iteracji
  239. if (sign(ya) == sign(yc))
  240. % DLACZEGO NIE STOSUJEMY ya*yc>0 ?
  241. % tu odp: http://wazniak.mimuw.edu.pl/index.php?title=MN03LAB
  242. a = c ; ya = yc ;
  243. else
  244. %%% TODO >>>
  245. %%% Aktualizacja zmiennych b i yb
  246. b = c; yb = yc;
  247. %%%<<<<
  248. endif
  249.  
  250. % Wyswietlenie komunikatu w przypadku gdy przyblizenia z zadana dokladnoscia
  251. % nie odnaleziono w zadanej maksymalnej liczbie iteracji
  252. if (ii >= k_max)
  253. disp('Nie odnaleziono zera funkcji z zadan� dokladnoscia.')
  254. endif
  255.  
  256. endfor
  257.  
  258. endfunction
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement