Miejsca zerowe funkcji

0

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)?

0

O ile się nie mylę, metodą bisekcji możesz wyliczyć tylko jedno miejsce zerowe.

0

No ale chyba jakiś sposób musi być? Np. manipulacja przedziałami daje odpowiednie wyniki .

0

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.

0

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?

0
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?

0

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ń.

0
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)

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