// Sinus.java MM 2010 /** * Sinusfunktion. */ public class Sinus extends DifferenzierbareFunktion { /* ------------------------------------------------- */ // service-Methode /** * Berechnen eines Funktionswertes f( x) = sin( x). * @param arg Argument * @return sin( arg) */ public double wert( double arg) { return mySinBesser( arg); } /** * Berechnen der ersten Ableitung * f'(x) = cos( x) = sin( PI/2 + x). * @param arg Argument * @return Wert der ersten Ableitung an der Stelle arg */ public double wertErsteAbleitung( double arg) { return wert( Math.PI / 2 + arg); } /* ------------------------------------------------- */ // Reihenentwicklung /** * Sinus-Funktion (Reihenentwicklung): * sin x = x - ( x ^ 3) / 3! + ( x ^ 5) / 5! ... * @param x Argument * @return Wert an der Stelle x nach Reihenentwicklung */ public double mySin( double x) { double alteSumme, neueSumme = x, summand = x; int j = 1; do // Reihenentwicklung { j++; summand *= -x * x / j; // neuer Summand j++; summand /= j; alteSumme = neueSumme; // neue Summe neueSumme += summand; } while(( neueSumme != alteSumme) && ( j < 1000)); return alteSumme; } /** * Verbesserte Sinusfunktion: * Transformation von x auf den Wertebereich [0,PI/2]. * @param x Argument * @return Wert an der Stelle x nach Reihenentwicklung */ public double mySinBesser( double x) { int s = 1; // Vorzeichen // x < 0 if( x < 0) { x = -x; s = -s; } // x > PI while( x > Math.PI) // 1. Variante { x -= Math.PI; s = -s; // Vorzeichenwechsel } /* if( x > Math.PI) // 2. Variante { int temp = ( int)( x / Math.PI); if( temp%2 !=0) s = -s; x = x - temp * Math.PI; } */ // x > PI/2 if( x > Math.PI/2) x = Math.PI - x; return s * mySin( x); } /* ------------------------------------------------- */ // toString-Methode /** * Darstellen der Funktion sin. * @return Funktion in linearer Schreibweise */ public String toString() { return "sin( x)"; } }