Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> skrypt - niemożliwe wyniki obliczeń
yariire
post
Post #1





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 2.11.2006

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
jackie
post
Post #2





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 22.10.2006

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 8.10.2025 - 16:47