# Bisektionsverfahren  (Mathematische Funktion)



## matt65 (6. Mai 2010)

Hi,

ich bin dabei das Bisektionsverfahren für die Nullstellenbestimmung für Java in Eclipse zum erstellen, dabei habe ich hier im Forum folgenden Code gefunden, welchen ich noch anpassen wollte, doch leider vergebens;

Hier der Text:


```
interface Function { 
	        double evaluateAt(double x); 
	} 

	class Funktionen {
		
		//wollte hier 	f1= 1-x^2/2
		//				f2= 1+sin(x)-x^0,5
		//				f3= 0,000001-sin(0,000001x)
		//definieren
	
		
	}
	
	
	class F1 implements Function { 
	        public double evaluateAt(double x) { 
	                return Math.cos(x)-x; 
	        } 
	} 

	class Bisektionsverfahren { 
	        static boolean BiSektion(double a, double b, double eps, Function f1) { 
	                if (f1.evaluateAt(a)*f1.evaluateAt(b) > 0) 
	                        return false; 
	                
	                int n=0;
	                double m;
	                for (n=0; Math.abs(a-b) >= eps; n++) { 
	                        m = (a+b)/2;
	                        
	                        if (f1.evaluateAt(a)*f1.evaluateAt(m) > 0) 
	                                a = m; 
	                        else
	                                b = m; 
	                }
	                
	                System.out.println(n + ", " + (a+b)/2);
	                
	                return true;
	        }
	        
	        public static void main(String arg[]) { 
	                Function f1 = new F1(); 
	                if (BiSektion(0.0,1.0,0.0001,f1)) {
	                        System.out.println("Success!");
	                } else {
	                        System.out.println("Failure...");
	                }
	        }
	
	}
```

Das Problem ist die Erstellung und Einbindung der class Funktionen, irgendwas geht da nicht, bekomme immer Fehler angezeigt und kann nicht auf Funktion zugreifen.
Außerdem wollte ich jeweils für die Funktionen f1, f2, f3 Intervallgrenzen eingeben; weis nicht wie bzw. wo ich das machen soll. (Müsste ich ja z.B. a=0, b=2 für Intervall [0,2] festsetzen, oder?)
Die Berechnung soll dann mit Genauigkeit von 0,0001 erfolgen, wird diese Genauigkeit durch den letzten if Zweig
if (BiSektion(0.0,1.0,0.0001,f1)) angezeigt, oder was bedeutet dies?

Vielen Dank für die Antworten bzw. Hilfe!


----------



## SlaterB (7. Mai 2010)

die Intervallgrenzen a und b gibts doch schon, kannst du beim Aufruf übergeben,

sicherlich kannst du in den Funktionen diese selber generell auf einen x-Bereich einschränken, meinst du das?
das wäre dann allein eine Frage für die Funktion-Klassen

0,0001 ist eine Art Genauigkeit, richtig, hier für die Intervall-Breite, nicht unbedingt den y-Wert, kann man alles programmieren wie man will

F1-F3 solltest du in eigenen Klassen definieren so wie ein F1 schon vorgegeben ist,
diese Klasse kopieren, umbenennen und die evaluate-Methode ändern auf die richtige Formel,
was sicher gar nicht so leicht ist

was die Klasse Funktionen dabei leisten soll ist bisher nicht verständlich


----------



## matt65 (7. Mai 2010)

Gut also ich wollte erstmal z.b. die Berechnung für die Funktion f(X)= 1-(x^2/PI) durchführen für die Intervallgrenzen [0,2] und mit einer Genauigkeit von 0,0001 (x-Richtung genügt) das Ergebnis erhalten.

Was müsste ich jetzt konkret am Text ändern, evaluate Methode anpassen, dass das funktioniert.

Vielen Dank für die Antwort


----------



## matt65 (8. Mai 2010)

Hab mittlerweile das Prog. etwas umgebaut.
Nur weis ich nicht, wo ich hier die für jede Funktion f(x) entsprechenden Intervallgrenzen eingeben kann, außerdem komme ich nicht mit der Eingabe meiner Funktionen zurecht, gibt nur Fehlermeldungen, die Methode Math. wird dann auch nicht mehr erkannt.

Vielleicht könnte mir jemand ein paar Tipps geben, damit das ganze dann auch funktioniert.

Danke.


```
public class Nullstelle {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		System.out
				.println("Die Nullstelle mit einer Genauigkeit von 0,0001 lautet:");

		System.out.println(nullstelle(0, 0001));
	}

	static double nullstelle(double a, double b)
	// Bisektionsverfahren für die Funktion x
	{
		double m, y;

		while (b - a > 1e-4) // Abbruch, wenn Intervall klein genug
		{
			m = (a + b) / 2; // Berechne Mitte
			y = f2(m); // und Wert in der Mitte
			if (y > 0)
				a = m; // Nimm rechtes Halb-Intervall
			else
				b = m; // Nimm linkes Halb-Intervall
		}
		return (a + b) / 2;

	}

	static double f1 (double x)
	   // Funktion  f(x) =  1 - x^2  /PI; deren Nullstelle berechnet wird
	   {   return Math.1-(x*exp(x)2)/PI);
	    }

	static double f2(double x)
	// Funktion, deren Nullstelle berechnet wird
	{
		return Math.exp(x) - 4 * x;
	}

	static double f3(double x)
	// Funktion, deren Nullstelle berechnet wird
	{
		return Math.exp(x) - 4 * x;
	}

}
```


----------



## SlaterB (8. Mai 2010)

>  return Math.exp(x) - 4 * x;
geht doch oder?

> return Math.1-(x*exp(x)2)/PI);
ist natürlich Quark, was soll man dazu sagen, schreibe keinen Quark!

Eins ist immer noch 1 und nicht Math.1, 
man kann doch nicht völlig wirre unbegründete Buchstabenfolgen korrigieren?

------

> gibt nur Fehlermeldungen,

ansonsten bitte genauer was nicht geht,

und immer LANGSAM anfangen!
erstelle doch erstmal eine Funktion (nicht 3), und versuche davon den Funktionswert an einer Stelle auszugeben (statt gleich komplexe Intervalle, Nullstellensuche-Algorithmen usw.)
wenn die kleinen Dinge schon gehen, umso besser, dann das Programm Schritt für Schritt erweitern bis du genau an ein bestimmtes neues Problem gelangst,
das dann hier evtl. nachfragen

(ich persönlich bin jetzt allerdings wahrscheinlich bis abends nicht mehr da)


----------



## matt65 (8. Mai 2010)

Alles klar,

ich wollte halt jetzt noch weitere Funktionen einfügen,
die erste return Math.exp(x) - 4 * x; geht auch.
Nur wenn ich jetzt eine neue einfügen will, kommt es zu Komplikationen, denn weis ich nicht genau wie das mit der Math. Methode funktioniert, deshalb kommt auch "Quark" raus.
Muss ich da etwa neue Class errichten, worin ich die Funktion defieniere, oder wie bzw. was muss ich machen.

Als nächstes wollte ich dann natürlich jeweils nur für eine Berechnung a, b also Intervallgrenzen Werte zuweisen, worin Bisektion ausgeführt wird, da schon andere Werte rauskommen sollten.


----------



## SlaterB (8. Mai 2010)

> Nur wenn ich jetzt eine neue einfügen will, kommt es zu Komplikationen, denn weis ich nicht genau wie das mit der Math. Methode funktioniert

welchen mathematischen Sachverhalt willst du denn ausdrücken, es geht dabei doch sicher nur im den Inhalt einer 
return irgendwas mit x;
Zeile

> Muss ich da etwa neue Class errichten, worin ich die Funktion defieniere, oder wie bzw. was muss ich machen.

wie du die Funktion an sich komplett definierst ist dagegen ein völlig anderes Thema, hat absolut nichts mehr mit der Math-Klasse zu tun

mehrere Funktionen am besten so wie im ersten Post, was du da kompiert hast, ein Interface, jede Methode eine neue Klasse,
einfach den F1-Klassencode kopieren, umbennen, fertig ist eine neue Funktion,
ganz ohne statische Methoden


----------

