15: Schleifen 8 – Cosinusfunktion

 

Berechnen Sie näherungsweise die Funktion cos(x) durch die Reihenentwicklung:

\cos \left( x \right) = \sum\limits_{i = 0}^\infty  {\left( {-1} \right)^i  \cdot \frac{{x^{2i} }} {{\left( {2i} \right)!}}}

Berechnen Sie das Ergebnis von cos(x) durch Vorgabe von:

  • Anzahl der Reihenglieder
  • Anzahl der genauen Dezimalstellen

Wie können Sie die aufwändigen Berechnungen von x2i und (2i)! vereinfachen? Versuchen Sie dabei, das Ergebnis aus dem vorherigen Schritt (i-1) hier mit zu benutzen.

Berechnen Sie mit Hilfe der Aufgabe 14 den Wert von cos(π).

Lösung

Berechnung für beliebige Werte

import java.util.Scanner; 	// Scanner für die Eingabe von Werten

public class Aufgabe15
{
	public static void main(String[] args)
	{
		// Variablen Deklaration
		Scanner scnEingabe = new Scanner(System.in);
		double dErgebnis, dAbweichung, dEPS, dZahl;
		int iDezimalstellen, iSchritte, iModus, iSchritt;

		// Variablen Initialisierung
		dErgebnis = 1.;
		iSchritt = 0;
		System.out.print("Berechnung des Cosinus von: ");
		dZahl = scnEingabe.nextDouble();

		System.out.println("\nMöglichkeiten zur Berechnung von Pi:");
		System.out.println("(1) Anzahl der Entwicklungsschritte vorgeben");
		System.out.println("(2) genaue Dezimalstellen vorgeben");

		System.out.print("\n   Bitte wählen: ");
		iModus = scnEingabe.nextInt();

		if (iModus == 1)
		{
			System.out.print("\n Entwicklungsschritte: ");
			iSchritte = scnEingabe.nextInt();

			double dZaehler = 1.;
			int iNenner = 2;			

			for (iSchritt = 1; iSchritt <= iSchritte; ++ iSchritt)
			{
				dZaehler *= (dZahl * dZahl);

				if (iSchritt > 1)
					iNenner *= (iSchritt * 2- 1) * (iSchritt * 2);

				dErgebnis += Math.pow(-1, iSchritt) * (dZaehler / iNenner);
			} // end for

			System.out.println("Ergebnis: Cosinus von "+dZahl+" = "
					+ dErgebnis+" nach "+iSchritte+" Schritten");
		} // end if

		else if (iModus == 2)
		{
			System.out.print("\n genaue Dezimalstellen: ");
			iDezimalstellen = scnEingabe.nextInt();

			dEPS = 1. / Math.pow(10, iDezimalstellen);

			double dZaehler = 1.;
			int iNenner = 2;

			do
			{ // berechnet den Cosinus auf angegebene Dezimalstellen genau
				++ iSchritt;

				dZaehler *= (dZahl * dZahl);
				if (iSchritt > 1)
					iNenner *= (iSchritt * 2- 1) * (iSchritt * 2);

				double dPrev = dErgebnis;
				dErgebnis += Math.pow(-1, iSchritt) * (dZaehler / iNenner);

				dAbweichung = dPrev-dErgebnis;
				if (dAbweichung < 0)
					dAbweichung *= -1.;
				System.out.println("Z: "+dZaehler+" N: "+iNenner+" -> "
						+ dErgebnis);
			} // end do
			while (dAbweichung > dEPS);

			System.out.println("Ergebnis: Cosinus von "+dZahl+" = "
					+ dErgebnis+" nach "+iSchritt+" Schritten");
		} // end else if
		else
			System.out.println("Ungültigen Modus gewählt!.");
	} // end main
} // end class

Berechnung von cos(π)

public class Aufgabe15b
{
	public static void main(String[] args)
	{
		// Variablen Deklaration
		double dErgebnis, dPi, dZaehler;
		int iSchritt, iNenner;

		// Variablen Initialisierung
		dErgebnis = 1.;
		dPi = 1;
		dZaehler = 1.;
		iSchritt = 0;
		iNenner = 2;

		System.out.print("Berechnung des Cosinus von pi");
		for (iSchritt = 1; iSchritt <= 50000; ++ iSchritt)
			dPi += Math.pow(-1, iSchritt)*(1. / (2 * iSchritt+1));
		dPi *= 4.;

		for (iSchritt = 1; iSchritt <= 6; ++ iSchritt)
		{
			dZaehler *= (dPi * dPi);

			if (iSchritt > 1)
				iNenner *= (iSchritt * 2- 1) * (iSchritt * 2);

			dErgebnis += Math.pow(-1, iSchritt) * (dZaehler / iNenner);
		} // end for

		System.out.println("Ergebnis: Cosinus von Pi = "
				+ dErgebnis+" nach 5 Schritten");
	} // end main
} // end class