Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Metoda połowienia przedziału - bisekcja
Forum PHP.pl > Forum > Przedszkole
Danielcom
Witam,
mam problem jak w temacie. Muszę napisać funkcję znajdująca miejsce zerowe funkcji, metodą połowienia(bisekcji) .
Prawdę mówiąc nie mam pojęcia jak ta funkcja ma wyglądać. Wiem jak wykonuje się te obliczenia, gorzej z przeniesieniem tego do PHP.
Nie chcę gotowca, ale za schemat blokowy będę bardzo wdzięczny.
ucho
0. Bierzesz jakiś przedział przedział [x1,x2].
1. x3 = x1+((x2-x1)/2)
2. obliczasz y1= f(x1), y2=f(x2), y3=f(x3)
3. jeśli któryś y3 jest równy 0 to znaleźliśmy =)
4. Jeśli y1*y3<0:
x2 = x3
Jeśli y2*y3<0:
x1 = x3
5. goto 1
Danielcom
Zrobiłem czarodziej.gif

Kod dla potomnych smile.gif


  1. function f($x){
  2. return $x * $x * $x * ($x + sin($x * $x - 1) - 1) - 1;
  3. }
  4.  
  5. function oblicz(){
  6.  
  7. if ( (isset($_GET['a'])) || (isset($_GET['b'])) ){ # sprawdzenie czy istnieją zmienna $a i $b
  8.  
  9. $a = $_GET['a'];
  10. $b = $_GET['b'];
  11.  
  12. $fa=f($a);
  13. $fb=f($b);
  14. $ex = '0.0000000001'; # dokładność porównania z zerem
  15. if (($fa * $fb) >0){
  16. echo "<br /><br /><b>Funkcja nie spełnia założeń</b>";
  17. }else{
  18.  
  19. while(abs($a-$b) > $ex){
  20. $x0=(($a+$b)/2); $f0=f($x0);
  21. if(abs($f0) <$ex )break;
  22. if ($fa * $f0 <0){
  23. $b=$x0;
  24. }else{
  25. $a = $x0; $fa = $f0;
  26. }
  27. }
  28. }
  29. // Wyświetlanie danych
  30. if (!empty ($x0)){ # jeśli istnieje $x0
  31. echo "<br /><br />x0 = ";
  32. printf("%.16f", $x0); # wynik z dokładnością do 16 miejsc po przecinku
  33. # dla przedziału (1,2) x0 wynosi xo = 1.1898329904070124
  34. # dla przedziału (-1,0) x0 wynosi xo = -0.7730407246272080
  35. }
  36.  
  37. }
  38. }
  39. return oblicz();
  40.  
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.