Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [inne]Nietypowy algorytm
Forum PHP.pl > Forum > Przedszkole
spayk
Czy jest jakiś sensowny algorytm na generowanie równań kwadratowych tak aby x1 i x2 były liczbami całkowitymi ?
Johnas
rozwiń co chcesz uzyskać.
sada
Ja bym nie kombinował tylko napisał funkcję rozwiązującą równanie kwadratowe i przeleciał ją w trzech zagnieżdżonych pętlach po współczynnikach a, b,c w rozsądnych zakresach i zostawiał tylko kombinację dającą całkowite x1 i x2
thek
A po kiego czorta rozwiązywać? Znasz wzorki? To czemu nie idziesz "od tyłu"? Znając rozwiązanie i wzory je obliczające masz drogę niemal równie prostą smile.gif
x1 = (-b - sqrt(b*b - 4*a*c))/(2*a);
x2 = (-b + sqrt(b*b - 4*a*c))/(2*a);
z warunkiem:
b*b > 4*a*c
Pozostaje podstawiać x1 i x2 i się bawić, bo dostajesz układ 2 równań i nierówność z 3 niewiadomymi. Wystarczy, że za jedna z niewiadomych podstawisz dowolną liczbę i pozostałe sobie ładnie wyliczysz.

EDIT: Zapomniałem kompletnie o wzorach Viete'a...
x1 * x2 = c/a
x1 + x2 = -b/a

x1 i x2 masz... wybierz sobie jedynie jakąś liczbę a != 0 i masz układ banalny do rozwiązania smile.gif
sada
Wydawało mi się , że autorowi chodziło o równania książkowe czyli również z całkowitymi a,b,c

...chociaż jeśli "a" będzie całkowite to b i c też
spayk
narazie dzięki biggrin.gif
zaraz pomyśle i zobaczymy co z tego wyjdzie

Refresh
Jednak sobie nie poradziłem.
Czy ktoś ma jakiś pomysł?
thek
Szczerze? Nie wiem z czym masz problem... Wzorki Viete'a są banalne, masz więc zwykłe podstawienie i potem już zabawę w podstawianiu kolejnych liczba pod a oraz sprawdzanie czy wynik jest OK dla Twoich wymagań :/ Ja bym zrobił tak:
a) Pobieramy x1 i x2, przypuśćmy -3 i -1
b) x1*x2 = 3; x1+x2 = -4 więc podstawiamy - mamy 3 = c/a oraz -4 = -b/a ale możemy od razu przenieść a na drugą stronę, czyli 3*a = c i -4*a = -b
c) bierzemy sobie dowolne a ( ja wezmę 1) i podstawiamy 3 = c oraz -4 = -b, czyli c = 3 i b = 4. KONIEC
d) Można iść dalej i dać kilka dodatkowych warunków jak choćby to, ile równań ma być znalezionych. Jeśli chcesz ograniczyć ,b,c,x1,x2 jedynie do całkowitych to zrób sobie skakanie od 1 do wolnej liczby w zakresie Z = <-z, z> z pominięciem 0. To jak to zrobisz, zależy od Ciebie. Ja bym sobie zrobił poprzez skakanie z naprzemienną zmianą znaku na zasadzie: 1, -1, 2, -2, 3, -3 i wyjściem gdy dojdzie się do końca zakresu lub zostanie znaleziona określona liczba równań. Można też to olać, bo jeśli się przyjrzysz, to mając jedno rozwiązanie, możesz łatwo kolejne uzyskać. Równania kwadratowe się prosto skalują ;) Wystarczy wszystkie parametry pomnożyć przez tę samą liczbę. Jeśli więc masz tylko jedno rozwiązanie, masz od razu dla tej samej pary rozwiązań, nieskończenie wiele możliwości równań.
WERSJA OBLICZAJĄCA - PODSTAWOWA:
  1. <?php
  2. $a = 1;
  3. $x1 = 3;
  4. $x2 = -2;
  5. $koniec = 3;
  6. $answers = array('rozwiazania' => array('x1' =>$x1, 'x2' => $x2 ), 'wspolczynniki' => array()); //tablica odpowiedzi
  7. while($a <= $koniec )
  8. {
  9. $c = $a* ($x1*$x2);
  10. $b = -1*$a*($x1+$x2);
  11. $answers['wspolczynniki'][] = array('a' => $a, 'b' => $b, 'c' => $c);
  12. if($a > 0)
  13. {
  14. $a *= -1;
  15. }
  16. else
  17. {
  18. $a = -1*$a + 1;
  19. }
  20. }
  21. var_dump($answers);
  22. ?>

WERSJA OPTYMALIZOWANA:
  1. <?php
  2. $a = 1; // to zostawiamy... jest naszym licznikiem, ale i parametrem a
  3. $x1 = 3; // jedno z rozwiązań
  4. $x2 = -2; // drugie z rozwiązań
  5. $koniec = 3; // tu sobie zrobiłem zakończenie, czyli zakres od współczynnika a od -3 do 3, włącznie
  6. $answers = array('rozwiazania' => array('x1' =>$x1, 'x2' => $x2 ), 'wspolczynniki' => array()); // tablica odpowiedzi
  7. //obliczenie rozwiązania dla 1
  8. $c = $a* ($x1*$x2); // obliczenie c
  9. $b = -1*$a*($x1+$x2); //obliczenie b
  10. $answers['wspolczynniki'][] = array('a' => $a, 'b' => $b, 'c' => $c); // wrzucenie pierwszego rozwiązania
  11. $a = -1; // przestawienie a na wartość ujemną
  12. while($a <= $koniec ) // można wykorzystać podatność równania kwadratowego na skalowanie jako optymalizację
  13. {
  14. $answers['wspolczynniki'][] = array('a' => $answers['wspolczynniki'][0]['a']*$a, 'b' => $answers['wspolczynniki'][0]['b']*$a, 'c' => $answers['wspolczynniki'][0]['c']*$a); // proste wyliczenie kolejnych rozwiązań na podstawie współczynnika skalującego a i obliczonego pierwszego rozwiązania
  15. if($a > 0) // przestawianie na ujemną liczbę współczynnika a...
  16. {
  17. $a *= -1;
  18. }
  19. else // ... i przywracanie na dodatni gdy mamy ujemny
  20. {
  21. $a = -1*$a + 1;
  22. }
  23. }
  24. var_dump($answers); //odpowiedzi :)
  25. ?>
Weź sobie sam porównaj tablice z wynikami i powiedz, czy są identyczne :) Jak dla mnie - są.
celbarowicz
Generuj, jak są błędy to popraw.
  1. <?php
  2. function r_kwadratowe($a,$x1,$x2){
  3. $m=-$a*($x1+$x2);
  4. $n=$a*($x1*$x2);
  5. $funkcja='f(x)='.$a.'x_kwadrat';
  6. if($m>0){$funkcja.='+'.$m.'x';}
  7. if($m<0){$funkcja.=$m.'x';}
  8. if($n>0){$funkcja.='+'.$n;}
  9. if($n<0){$funkcja.=$n;}
  10. echo $funkcja;
  11. }
  12. //przykład generowania
  13. for($i=1;$i<=10;$i++){
  14. $a=rand(-20,25);
  15. $x1=rand(-20,25);
  16. $x2=rand(-20,25);
  17. // echo $a.' '.$x1.' '.$x2.' ';
  18. if($a<>0) { r_kwadratowe($a,$x1,$x2);}
  19. echo '<br>';
  20. }
  21. ?>
  22.  
spayk
dzięki smile.gif
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.