Co zrobić, aby krzywa funkcji 1/x była rzeczywiście krzywą?

0

Wrzucam fragment kodu, który odpowiada za błędne (takie kanciate) rysowanie funkcji. Korzystam z JFreeChart. Wcześniej stworzyłem program, który poprawnie rysuje x^3.

while(xx<5)
{
    a = Double.parseDouble(atxt.getText());
    if (xx==0) ++xx;
    divresult = Math.pow(xx, -1);
    yy =a*divresult;
    xyseries.add(xx, yy);
    xx=xx+krok;
}

Jakieś pomysły? Co robię źle?
edit: aha, krok jest np. 0.001

0

Co Chcesz zrobić, podnieść liczbę rzeczywistą do potęgi?

0

@lion137: Chce na podstawie zbioru danych x oraz oraz zbioru obliczonych rzeczywistych danych y, narysować poprzez jfreechart ładny wykres funkcji. Zgodnie z tym co napisałem w poście, udało mi się to dla y=x^3.

0

Ale co tu się ma dziać w tej funkcji, linijka po linijce.

0

To jest grupa problemów (algorytmów) pn wygładzanie krzywych. Pamiętam nazwisko Beziera. Większość kombajnów do wykresów ma wiele algorytmów do wyboru.

Mile widziany rzetelny podkład z matematyki (wielomiany w paluszku), statystyki, metod szacunku błędów z pomiarów (jeśli rzeczywiście z pomiarów).

Aha, "zbioru obliczonych rzeczywistych danych y" to za bardzo ścisłe nie jest. To obliczone czy rzeczywiste?

UPDATE: Gdzie deklaracje zmiennych? Tam też mogłeś minę umieścić.

0
  1. Pobranie z jtextfield podanej wartości oraz przekonwertowanie jej do typu double.
  2. Zabezpieczenie przed dzieleniem przez zero, ponieważ ma być rysowana funkcji 1/x.
  3. Wykorzystanie Math.pow do stworzenia ułamka z liczby x, czyli Math.pow(x,-1) jak wyżej.
  4. Obliczenie wartości y.
  5. Narysowanie funkcji poprzez metodę xyseries.add(x,y).
  6. Zwiększenie o krok liczby x.
    I rysuje mi, ale nie dwie krzywe, tylko jakieś kanciate linie. Tyle.
0

Funkcja y=1/x ma "stromy" wykres. Jeżeli biblioteka JFreeChart łączy punkty wykresu odcinkami, to nic nie poradzisz na kanciatość wykresu.
@AnyKtokolwiek zwrócił Ci już uwagę na kuriozalne (w świecie liczb rzeczywistych) sprawdzanie:

if(xx == 0)

Mam dwie propozycje;

  • Zrezygnuj zupełnie ze sprawdzania, w Javie dzielenie przez 0 jest dopuszczalne, Math.pow(0.0, -1) zwraca Infinity. Istnieje ryzyko, że biblioteka JFreeChart nie akceptuje nieskończoności.
  • Sprawdzaj tak:
a = Double.parseDouble(atxt.getText()); //to powinno być na zewnątrz pętli
while(xx<5)
{
    divresult = Math.pow(xx, -1);
    if(!Double.isInfinite(divresult))
    {
        yy =a*divresult;
        xyseries.add(xx, yy);
    }
    xx=xx+krok;
}

(zmienne o nazwach 'divresultikrok`w jednej pętli wyglądają dziwacznie).

0

Słuchajcie, dzięki za podpowiedzi, ale już sobie poradziłem. Przedebugowełem po prostu - idiota ze mnie i tyle. Dałem jak niżej i działa tak, jak powinno:

int a;
int xx=-40;
double divresult,
double yy;
while(xx<40)
                    {
                        a = Double.parseDouble(atxt.getText());
                        if (xx==0) ++xx;
                        divresult = Math.pow(xx, -1);
                        yy =a*divresult;
                        xyseries.add(xx, yy);
                        xx++;
                    }

  1. Z tą nieskończonością to ciekawostka dla mnie jest.
  2. Co zaś do dzielenia przez zero - chyba jednak java nie dopuszcza takowego, bo zanim dałem zabezpieczenie, to przerwało mi działanie programu i dostałem wyjątek.
1
  1. Wyrzuć parsowanie
a = Double.parseDouble(atxt.getText());

przed pętlę.
2. Nie pomyślałem, że xx jest typu int, dzielenie przez zero jest dopuszczalne dla typów zmiennoprzecinkowych. Ale wyjątek u Ciebie był spowodowany czym innym. W Twoim kodzie nie ma dzielenia, a Math.pow(0, -1) nie rzuca wyjątkiem.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.