Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [inne]Nietypowy algorytm
spayk
post
Post #1





Grupa: Zarejestrowani
Postów: 364
Pomógł: 3
Dołączył: 29.11.2008

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


Czy jest jakiś sensowny algorytm na generowanie równań kwadratowych tak aby x1 i x2 były liczbami całkowitymi ?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
Johnas
post
Post #2





Grupa: Zarejestrowani
Postów: 650
Pomógł: 16
Dołączył: 5.07.2010
Skąd: Ściśle Tajne

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


rozwiń co chcesz uzyskać.
Go to the top of the page
+Quote Post
sada
post
Post #3





Grupa: Zarejestrowani
Postów: 302
Pomógł: 24
Dołączył: 6.12.2008

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


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
Go to the top of the page
+Quote Post
thek
post
Post #4





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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ą (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/smile.gif)
Powód edycji: [thek]: Zapomniałem o wzorach Viete'a
Go to the top of the page
+Quote Post
sada
post
Post #5





Grupa: Zarejestrowani
Postów: 302
Pomógł: 24
Dołączył: 6.12.2008

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


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ż

Ten post edytował sada 22.02.2012, 11:43:52
Go to the top of the page
+Quote Post
spayk
post
Post #6





Grupa: Zarejestrowani
Postów: 364
Pomógł: 3
Dołączył: 29.11.2008

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


narazie dzięki (IMG:style_emoticons/default/biggrin.gif)
zaraz pomyśle i zobaczymy co z tego wyjdzie

Refresh
Jednak sobie nie poradziłem.
Czy ktoś ma jakiś pomysł?
Go to the top of the page
+Quote Post
thek
post
Post #7





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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ą.
Powód edycji: [thek]:
Go to the top of the page
+Quote Post
celbarowicz
post
Post #8





Grupa: Zarejestrowani
Postów: 253
Pomógł: 31
Dołączył: 30.03.2009
Skąd: Szczecin

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


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.  


Ten post edytował celbarowicz 23.02.2012, 13:30:02
Go to the top of the page
+Quote Post
spayk
post
Post #9





Grupa: Zarejestrowani
Postów: 364
Pomógł: 3
Dołączył: 29.11.2008

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


dzięki (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

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: 25.08.2025 - 06:50