001 package de.hska.java.aufgaben.suchen;
002
003 /**
004 * Sucht eine Nullstelle einer stetigen Funktion f : R -> R
005 * näherungsweise mit einem Halbierungsverfahren.
006 *
007 * <p>
008 * <a href="http://www.home.hs-karlsruhe.de/~pach0003/informatik_1/aufgaben/suchen.html#nullstellen">Zurück zum Aufgabentext</a>
009 * </p>
010 *
011 *
012 * @author Christian Pape
013 */
014 public class Nullstellensuche {
015
016 /**
017 * Die (stetige) Funktion für die Nullstellen gesucht werden sollen.
018 */
019 private Funktion funktion;
020
021 /**
022 * Genauigkeit, mit der Nullstellen von <code>funktion</code> berechnet werden
023 * sollen.
024 */
025 private double genauigkeit = 0.000001;
026
027 /**
028 * Erzeugt eine neue Nullstellensuche mit der gegeben
029 * stetige reelwertigen <code>funktion</code>. Die Nullstelle
030 * kann nährungsweise bis zur angegeben <code>genauigkeit</code>
031 * berechnet werden.
032 *
033 * @param funktion eine <code>stetige</code> Funktion
034 */
035 public Nullstellensuche(Funktion funktion, double genauigkeit) {
036 this.funktion = funktion;
037 this.genauigkeit = genauigkeit;
038 }
039
040 /**
041 * Sucht eine Nullstelle in dem gegeben Intervall [links, rechts] und
042 * findet sie auch, wenn die Vorzeichen von f(links) und f(rechts) verschieden sind,
043 * dass heisst, wenn f(links) * f(rechts) < 0 sind.
044 */
045 public double sucheNullstelle(double links, double rechts) {
046 double mitte = (links + rechts) / 2.0;
047
048 if ( Math.abs( funktion.f(mitte) ) < genauigkeit ) {
049 return mitte;
050 } else if ( funktion.f(mitte) * funktion.f(rechts) < 0 ) {
051 return sucheNullstelle(mitte, rechts);
052 } else {
053 // man überzeuge sich hier, dass f(mitte) * f(links) < 0 gelten muss!
054 return sucheNullstelle(links, mitte);
055 }
056 }
057 }