// 2. Übung, Aufgabe 3 (Abbruchkriterium) #include #include main() { const double EPS = 1e-5; // Genauigkeit double a, an, s_new, s_old, qa; int n; cout << endl; cout << " a = "; cin >> a; // Initialisierung für abweisenden Zyklus qa = 1.0/sqrt(a); // Faktor in geom. Reihe n = 0; // Erster Index an = 1.0; // Erstes Folgenglied s_new = an; // Erste Partialsumme s_old = s_new-2*EPS; // oder eine andere Zahl, sodaß 1.Test falsch ist while ( s_new-s_old >= EPS*s_new // Test auf relative Genauigkeit || // hier: logisches ODER s_new-s_old >= EPS // Test auf absolute Genauigkeit ) // (Var. an koennte im Zaehler genutzt werden) { n++; // Index erhoehen s_old = s_new; // alten Wert retten an *= qa; // neues Folgenglied berechnen s_new += an; // neuer Wert } // Hier muss n > -2*log(EPS)/log(a) sein (leicht analytisch zu berechnen) cout << "theor. Abbruchindex >= " << -2*log(EPS)/log(a) << endl << endl; // Ergebnisausgabe cout.precision(10); cout << " Wert der Reihe ist " << s_new << " bei n = " << n << endl; // Vergleich mit exaktem Wert double s_exact = sqrt(a)/(sqrt(a)-1); cout << " abs. Diff. zu exaktem Wert = " << s_exact - s_new << endl; cout << " rel. Diff. zu exaktem Wert = " << (s_exact - s_new)/s_exact << endl; cout << endl; // Es zeigt sich, dass (insbesondere bei a = 1.002001) // s_exact - s_new groesser ist als das EPS des Abbruchtestes. // Hier hilft nur eine Abschaetzung der restlichen Glieder // weiter, d.h. Mathematik, und diese Abschaetzung muss in den // Abbruchtest integriert werden. }