Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: skrypt - niemożliwe wyniki obliczeń
Forum PHP.pl > Forum > Przedszkole
yariire
Witam,

mój problem wygląda tak. Napisałam skrypt obliczający miejsca zerowe funkcji za pomocą metody siecznych. Dane wejściowe to dwa punkty startowe, dopuszczalny błąd obliczeń i max liczba iteracji. Wszystko działa ok dopóki nie wpiszę np takich danych:

x1 = 0 x2=5 blad = 0.99 liczba iteracji = np 200

wtedy otrzymuje dosyc dziwny wynik Miejsce zerowe funkcji: 12833090813.989

przy

x1 = 0 x2=8 blad = 0.99 liczba iteracji = np 200

Miejsce zerowe funkcji: -24.022540007882


Można jakoś uniknąć podobnych rewelacji?


kod skryptu:



  1. <?
  2.  
  3. function fun($x)
  4. {
  5. return 2*sin($x+2);
  6. }
  7.  
  8.  
  9. $f1 = fun($x1); $f2 = fun($x2);
  10.  
  11. settype($x0, "double");
  12. settype($x1, "double");
  13. settype($x2, "double");
  14. settype($f0, "double");
  15. settype($f1, "double");
  16. settype($f2, "double");
  17. settype($b, "double");
  18.  
  19.  
  20.  
  21. while($it && (abs($x1 - $x2) > $b))
  22. {
  23.  
  24.  
  25.  if(abs($f1 - $f2) < 0)
  26.  {
  27.  print("Złe punkty startowe.n");
  28.  $it = 0;
  29.  break;
  30. }
  31.  $x0 = $x1 - $f1 * ($x1 - $x2) / ($f1 - $f2);
  32.  $f0 = fun($x0);
  33.  if(abs($f0) < 0) break;
  34.  $x2 = $x1; $f2 = $f1;
  35.  $x1 = $x0; $f1 = $f0;
  36.  if(!(--$it)) print("Przekroczona liczba iteracji.n");
  37.  }
  38.  
  39.  
  40.  if($it) print("Miejsce zerowe funkcji: $x0");
  41.  
  42. ?>




link do skryptu w praktyce:
http://www.akadna.pl/sieczne/


DRUGA sprawa. wczesniej uruchamiałam ten skrypt na innym serwerze (mam dostęp do kilku kont na kilku roznych serwerach), do tej pory działał. Teraz nie działa(dodam ze nic nie zmienialam w miedzyczasie w kodzie). Przyjmuje dane z formularza ale nie wyswietla efektów strony. Wie ktoś może co jest grane?

link do niedzialajacego (2006-11-02 18:56 ) skryptu:

http://www.margot.webd.pl/pk/sieczne/

z gory dzieki
jackie
po pierwsze:
Zwróć uwagę na fragment kodu:
  1. <?php
  2. if(abs($f1 - $f2) < 0)
  3. {
  4. // ...
  5. break;
  6. }
  7. ?>

czy wartość bezwzględna z czegokolwiek może być kiedykolwiek mniejsza od zera?

po drugie:
prezentowany przez Ciebie kod oblicza miejsce zerowe funkcji 2*sin(x+2), natomiast skrypt na stronie oblicza miejsce zerowe funkcji -x^3+(3*x^2)-x+9. Być może stąd różnica w wynikach. Po wpisaniu danych, które podałeś otrzymałem poprawną (dla tych danych) wartość 0.81818181818182, ale po wpisaniu błędu np. 0.0001 wynik jest już 3.4620446236724 i jest to zgodne z tym pokazuje mi excel.

po trzecie:
pamiętaj, że metoda siecznych może nie być zbieżna dla konkretnych danych danych wejściowych.
nospor
Cytat
DRUGA sprawa. wczesniej uruchamiałam ten skrypt na innym serwerze (mam dostęp do kilku kont na kilku roznych serwerach), do tej pory działał. Teraz nie działa(dodam ze nic nie zmienialam w miedzyczasie w kodzie). Przyjmuje dane z formularza ale nie wyswietla efektów strony. Wie ktoś może co jest grane?

Masz wylaczone register_globals (i slusznie). Do zmiennych z forma nalezy sie odwolywac nie: $zmienna, a : $_POST['zmienna']

proszę poprawić tytuł o znacznik zgodnie z zasadami forum Przedszkole:
Temat: Tematyka i zasady panujace na forum Przedszkole
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.