Danielcom
10.01.2010, 23:22:09
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
11.01.2010, 02:48:11
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
12.01.2010, 19:25:33
Zrobiłem
Kod dla potomnych

function f($x){
return $x * $x * $x * ($x + sin($x * $x - 1) - 1) - 1;
}
function oblicz(){
if ( (isset($_GET['a'])) || (isset($_GET['b'])) ){ # sprawdzenie czy istnieją zmienna $a i $b
$a = $_GET['a'];
$b = $_GET['b'];
$fa=f($a);
$fb=f($b);
$ex = '0.0000000001'; # dokładność porównania z zerem
if (($fa * $fb) >0){
echo "<br /><br /><b>Funkcja nie spełnia założeń</b>"; }else{
$x0=(($a+$b)/2); $f0=f($x0);
if ($fa * $f0 <0){
$b=$x0;
}else{
$a = $x0; $fa = $f0;
}
}
}
// Wyświetlanie danych
if (!empty ($x0)){ # jeśli istnieje $x0 echo "<br /><br />x0 = "; printf("%.16f", $x0); # wynik z dokładnością do 16 miejsc po przecinku # dla przedziału (1,2) x0 wynosi xo = 1.1898329904070124
# dla przedziału (-1,0) x0 wynosi xo = -0.7730407246272080
}
}
}
return oblicz();