Czy mogę liczyć na jakąś podpowiedź odnośnie poniższego zadania? Nie wiem jak zacząć...
https://pl.wikipedia.org/wiki/Metoda_r%C3%B3wnego_podzia%C5%82u
Masz nawet algorytm napisany.
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.
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();
}
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ń.
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.
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();
}
}
}
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");