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

2018-12-22 19:10
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

edytowany 2x, ostatnio: furious programming, 2018-12-22 21:25
Gdzie deklaracje zmiennych? - AnyKtokolwiek 2018-12-22 20:17
Są deklaracje zmiennych, ale po co mam je podać? a jest double, pozostałem zmienne też, krok jest 0.001. - finito 2018-12-22 20:21
if (xx==0) ++xx; w świecie liczb rzeczywistych wygląda kuriozalnie - AnyKtokolwiek 2018-12-22 20:25

Pozostało 580 znaków

2018-12-22 19:51
0

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


Pozostało 580 znaków

2018-12-22 19:58
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.

edytowany 2x, ostatnio: finito, 2018-12-22 19:59

Pozostało 580 znaków

2018-12-22 20:04
0

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


Pozostało 580 znaków

2018-12-22 20:08
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ć.

edytowany 4x, ostatnio: AnyKtokolwiek, 2018-12-22 20:18

Pozostało 580 znaków

2018-12-22 20:09
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.
na marginesie, ułamek czyli odwrotność przez Math.pow(x,-1) to wytaczanie armat na muchę - AnyKtokolwiek 2018-12-22 20:11
Pewnie tak, ale i tak nie wiele to zmienia. - finito 2018-12-22 20:12

Pozostało 580 znaków

2018-12-22 20:24
0

http://www.jfree.org/jfreecha[...]es/XYSplineRendererDemo1a.png

Dałem wędkę, rybę sobie złap.

edytowany 1x, ostatnio: AnyKtokolwiek, 2018-12-22 20:24

Pozostało 580 znaków

2018-12-22 23:19
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).


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 2x, ostatnio: bogdans, 2018-12-23 01:55

Pozostało 580 znaków

2018-12-23 01:29
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.

Pozostało 580 znaków

2018-12-23 02:05
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.

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
Rany, to widzę, że nie tylko ja mam takie ambicje, by analizować javę w środku nocy;-)))))) - finito 2018-12-23 04:06

Pozostało 580 znaków

Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0