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    }