// Übung 3 - Aufgabe A (Lagrange interpolation) // g++ -Wno-deprecated u3A.cc #include #include main() { const int MAX_STUETZ = 10001; // Max. Anzahl von Stuetzpunkten ( = n+1 )!! const long double XA = 0.2, XE = 1.0; // Anfang und Ende des Intervalls long double x[MAX_STUETZ], // Stuetzstellen y[MAX_STUETZ], // Stuetzwerte li[MAX_STUETZ]; // Koeff. fuer Lagrangepolynom long double xx, // x-Wert, wo L-polynom ausgewertet werden soll. px, // L-Polynomwert fuer x t, // temp. Var. = Nenner/Zaehler von Koeff. von L-polynom xi; // temp. Variable fuer x[i] (Hilfsgr.) int n, // letzer Index fuer Stuetzpunkte ( < MAX_STUETZ) i,j,k; // Eingabe cout << endl; cout << " letzter Index n = "; cin >> n; cout << " Koord x = "; cin >> xx; cout << endl; // Berechnung der aequidistanten Stuetzpunkte und der // zugehoerigen Stuetzwerte for ( i=0; i<=n; i++ ) { xi = i*(XE-XA)/n + XA; x[i] = xi; // Hier die aktuelle Funktion eintragen // y[i] = sin(xi); y[i] = sin(3*M_PI/xi)/xi; } // Berechnung der Koeff. in L-polynom for ( i=0; i<=n; i++ ) { t = 1.0; // Initialisierung der Produktbildung xi = x[i]; // Erspart Adressrechnung in k-loop for ( k=0; k<=n; k++ ) { if ( k!=i ) // k==i muss ausgeschlossen werden (auch mit zwei Loops moeglich) { t = t * ( xx - x[k] ) / ( xi - x[k] ); } } li[i] = t; } // Berechnung des L-polynomwertes px = 0.0; // Initialisierung Summenbildung for ( i=0; i<=n; i++ ) { cout << i << " : " << li[i] << endl; px = px + y[i]*li[i]; } // L-Polynomwert und exakter Wert // Hier die aktuelle Funktion eintragen // cout << "exakt : " << sin(xx) << endl; cout << "exakt : " << sin(3*M_PI/xx)/xx << endl; cout << " L-polynom : " << px << endl; cout << endl; }