funkcja liniowa - otrzymywanie x na podstawie podanego y

0

Zrobiłem swój własny mały projekcik w Javie, obsługujący funkcję liniową y = ax + b. Chciałem stworzyć metodę, która po podaniu y zwraca tablicę ze wszystkimi możliwymi wartościami x (a i b są już przypisane).

public double[] getXfromY(int minimalX, int maximalX, double y) {
        double[] x;
        int tableLong = 0;
        for (double i = minimalX; i <= maximalX; i+=0.001) {
            if (i * a + b == y) {
                tableLong++;
            }
        }
        x = new double[tableLong];
        int actualTableID = 0;
        for (double i = minimalX; i <= maximalX; i+=0.001) {
            if (i * a + b == y) {
                x[actualTableID] = i;
                actualTableID++;
            }
        }
        return x;
    }

minimalX i maximalX służą do określenia najmniejszej i największej możliwej wartości X, jaka może znajdować się w zwracanej tablicy.

  1. Metoda ta nie działa. Dlaczego?
  2. Czy można to jakoś zmniejszyć? (bez korzystania z ArrayList)
0

jeżeli y=ax+b to x=(y-b)/a jest to tylko jedna wartość (albo dowolna wartość jeżeli a=0)

0

Zwariowałeś? Funkcja liniowa przechodzi przez określone y tylko raz lub nieskończenie wiele razy, to jest zwykła prosta. Piszesz bruteforce'a zamiast przekształcić y = ax + b i wyprowadzić x?

0

co to znaczy "metoda nie działa"? nie kompiluje się? nie zwraca oczekiwanego wyniku? rzuca wyjątkiem? w którym miejscu? jaka jest treść błędu? kurde, człowieku, przecież to podstawy, bez takich informacji to wróżenie z fusów.

moje fusy z torebki twierdzą, że w działaniach na liczbach zmiennoprzecinkowych nie używa się == ze względu na błędy zaokrągleń. 2 * 3 + 0 nie jest równe 0,6666...67. użyj sprawdzenia, czy błąd jest poniżej jakiegoś zakresu (zwykle zwanego eps) - Math.abs(i * a + b - y) < eps, a wartość eps ustal sobie np. na 10^-6.

0

omfg - ale ta funkcja ma być podstawą do zrobienia np. funkcji okresowej - wtedy każda liczba y będzie zwracała całą tablicę x.

Zbadałem to dokładniej i okazuje się, że metoda nie zwraca nic, jeżeli funkcja przechodzi przez y tylko raz. Gdy funkcja jest stała, wysyłają się wszystkie możliwości w sposób poprawny (przynajmniej tak mi się wydaje, bo jest ich dość sporo)

0
norbi452 napisał(a):

omfg - ale ta funkcja ma być podstawą do zrobienia np. funkcji okresowej - wtedy każda liczba y będzie zwracała całą tablicę x.

nie sądzę

0

Jeśli funkcja jest okresowa, to po Ci tablica wartości x? Wystarczy jedno x i wielkość okresu.

0

A funkcja liniowa z wartością bezwzględną z X? Zaraz dowiem się, że wystarczy X i -X, ale ja po prostu chcę, żeby metoda zwracała tablicę z wszystkimi wynikami w danym przedziale.

0

Nie jestem pewien co nazywasz funkcja liniową okresową. Przypuszczam, że funkcje o wykresie piłokształtnym, dla której jeden z zębów jest opisany równaniem y =ax + b. Jeśli tak, to aby wyliczyć wszystkie x z zadanego przedziału, dla których f(x) = y, to musisz podać przedział, na którym y = ax + b. Nie wystarczy znajomość a i b.

0

Funkcja liniowa jest okresowa, ale nie posiada okresu podstawowego nie posiada. Jeżeli będziesz chciał mieć okresowość np 2pi to wzór by musiał wygladać tak: y = sin(x), Jeżeli dodasz parametr b, to wykres będzie przesuwa się względem współrzędnej y.

0

Ja nie pytam, czy ta metoda jest potrzebna. Ja pytam, dlaczego nic nie zwraca.

0

Twoja metoda jest lekko bez sensu, może zwrócić albo pustą tablicę, albo tablicę jednoelementową. Jeśli zwraca pustą tablicę, to znaczy że dla żadnego i nie zachodzi równość:

i * a + b == y
0

Cały problem z twoim rozwiązaniem znajduje się między krzesłem a klawiaturą.
Twoje pojęcie matematyki leży i kwiczy, ten wątek nadaje się do kwiatków.
A czemu twój "algorytm" nic nie zwraca.
Po pierwsze od matematycznej strony masz źle, bo wcale nie ma gwarancji, ze wynik pokryje się idealnie z wielokrotnością 0.001.
Po drugie od strony informatycznej masz źle, bo tak się nie porównuje liczb zmiennoprzecinkowych! 0.001 nie ma idealnej reprezentacji w systemie binarnym, tak samo jak 1/3 nie ma idealnej reprezentacji w systemie dziesiętnym (0.33333333333...), masz błedy zaokrągleń i tym trzeba pamiętać.

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