Mam program który, za pomocą metody bisekcji liczy miejsce zerowe funkcji. https://pastebin.com/iYfDduHN
W jaki sposób go zmienić, żeby liczył wszystkie miejsca zerowe a nie tylko jedno (chodzi głownie o funkcję sinh)?
O ile się nie mylę, metodą bisekcji możesz wyliczyć tylko jedno miejsce zerowe.
No ale chyba jakiś sposób musi być? Np. manipulacja przedziałami daje odpowiednie wyniki .
Tak, wybierając inny przedział otrzymasz inny wynik - jednak w celu wybrania innego przedziału, musiałbyś już wpierw znać drugie miejsce zerowe; w innym wypadku masz do sprawdzenia całą dziedzinę liczb rzeczywistych, co może trochę zająć :-)
Metoda bisekcji zwraca jeden pierwiastek, tyle.
A nie ma sposobu, żeby w petli po znalezieniu miejsca zerowego zostało ono dodane np do HashSet a bisekscja szukała następnego pomijając już znalezione?
for (double i = lewa; i < prawa; i++)
{
tmp = bis(i, prawa);
pierwiastki[n] = ceil(tmp*pow(10, 3)) / pow(10, 3);
++n;
}
set<double> wynik(pierwiastki, pierwiastki + 20);
cout << "Funkcja (x^2-1)*sinh^3(x) posiada: " << wynik.size() <<
" pierwiastkow" << endl << endl << "Oto one:" << endl;
for (set<double>::iterator i = wynik.begin(); i != wynik.end(); i++)
cout << *i << endl;
ten kod w cpp podaje wszystkie miejsca zerowe za pomocą bisekcji tylko jak go przenieśc na mój kod w javie?
Może i podaje w tym konkretnym przypadku, ale jest nieprawidłowy i zawiedzie w momencie, gdy np. w przedziale (0, 1)
znajdzie się dwa czy więcej rozwiązań.
import java.lang.Math.*;
public class Main {
public interface Function {
public double f(double x);
}
private static int sign(double x) {
return (x < 0.0) ? -1 : (x > 0.0) ? 1 : 0;
}
public static void root(Function f, double a, double b, double krok) {
double x = a, ox = x;
double y = f.f(x), oy = y;
int s = sign(y), os = s;
for (; x <= b ; x += krok) {
s = sign(y = f.f(x));
if (s == 0) {
System.out.println(x);
} else if (s != os) {
double dx = x - ox;
double dy = y - oy;
double cx = x - dx * (y / dy);
System.out.format("Pierwiastek: " +"%-10.7f%n" ,cx);
}
ox = x; oy = y; os = s;
}
}
public static void main(String[] args) {
Function f = new Function () {
public double f(double x) {
return (x*x-1)*(Math.pow(Math.sinh(x),3));
}
};
root(f, -10000, 10000, 0.1);
}
}
znalazłem coś takiego jeszcze, tylko nie za bardzo wiem jaka metoda jest to rozwiązane (chyba Newtona ale żadnej pewności nie mam)