Pierwiastek równania [metoda bisekcji]

0

Czy mogę liczyć na jakąś podpowiedź odnośnie poniższego zadania? Nie wiem jak zacząć...

screenshot-20211111160034.png

2

A z czym konkretnie masz problem? Rozumiesz przytoczone twierdzenie? Słyszałeś o czymś takim ja wyszukiwanie połówkowe?
Jeśli wiesz ze funkcja f na końcach przedziału na różne znaki, to możesz sprawdzić znak w połowie przedziału, żeby stwierdzić czy miejsce zerowe jest w pierwszej czy w drugiej połówce. W ten sposób zawęziłeś przedział o połowę w jednym kroku. Możesz tak robić wiele razy aż przedział będzie wystarczająco mały.

0

Szukając jakichś podpowiedzi w Internecie, znalazłem i nieco zmodyfikowałem (na moje potrzeby) kod:

class xyz {
    static final float EPSILON = (float) 0.25;
    static double func(double x) {
        return x * x - 2;
    }


    static void bisection(double a, double b) {
        if (func(a) * func(b) >= 0) {
            System.out.println("You have not assumed" +
                    " right a and b");
            return;
        }

        double c = a;
        while ((b - a) >= EPSILON) {

            c = (a + b) / 2;


            if (func(c) == 0.0)
                break;


            else if (func(c) * func(a) < 0)
                b = c;
            else
                a = c;
        }

        System.out.printf("The value of root is : %.4f", c);
    }


    public static void main(String[] args) {

        double a = -1, b = 5;
        bisection(a, b);
    }

}

Oblicza prawidłowo. Ale mam problem, żeby prawidłowo sczytywał dane z pliku in.txt i wypisywał wynik
Kombinuję coś na ten wzór, ale chyba w złą drogę to zmierza -_-

public static void main(String[] args) throws FileNotFoundException {
        File file = new File("In.txt");
        PrintWriter save = new PrintWriter("Out.txt");
        Scanner in = new Scanner(file);
        double a = in.nextDouble();
        double b = in.nextFloat();
        float epsilon = in.nextFloat();
        double func = in.nextDouble();
    }
0
Rafał Masny napisał(a):
        double func = in.nextDouble();

Funkcji nie masz wczytywać z tego pliku tekstowego.
Z polecenia zrozumiałem, że powinieneś ją na sztywno zakodować w aplikacji.

Poza tym nie żongluj typami. Wczytuj wszystkie liczby jako double i używaj zmiennych typu double do obliczeń.

1

double func = in.nextDouble();

I co dokładnie wg ciebie robi ten kawałek kodu? Swoją drogą zbudowanie dynamicznej funkcji na bazie jakiejś słowno-muzycznej reprezentacji z pliku tekstowego nie jest takie proste i bez jakiegoś eval() na poziomie języka wymagałoby sparsowania takiego wyrażenia, coś jak napisanie mini-kompilatora.

0

Jak zrobić, żeby użytkownik wpisywał w pliku In.txt funkcję?

import java.io.File;
import java.util.Locale;
import java.util.Scanner;
import java.io.FileNotFoundException;
import java.io.PrintWriter;

class Main {
    public static void main(String[] args) throws FileNotFoundException {
        File file = new File("In.txt");
        Scanner in = new Scanner(file).useLocale(Locale.US);
        double a = in.nextDouble();
        double b = in.nextDouble();
        float epsilon = in.nextFloat();
        double func = in.nextDouble();
        bisection(a, b, epsilon, func);
    }

    private static double func(double x) {

        return x;
    }

    private static void bisection(double a, double b, float epsilon, double func) throws FileNotFoundException {
        PrintWriter save = new PrintWriter("Out.txt");
        if (save != null) {
            if (func(a) * func(b) >= 0) {
                save.println("You have not assumed right a and b");
                return;
            }
            double c = a;
            while ((b - a) >= epsilon) {
                c = (a + b) / 2;
                if (func(c) == 0.0)
                    break;
                else if (func(c) * func(a) < 0)
                    b = c;
                else
                    a = c;

            }
            save.println("" + c);
            save.close();
        }
    }
}
1

Tak jak pisałem wyżej, do tego trzeba jakiegoś eval na poziomie języka. W javie mozesz coś takie uzyskać np. za pomocą jakiegoś

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
Object result = engine.eval("4*5");

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