T
Ohwei, ich glaube, ich habe in ein Wespennest gestochen.
Ich bin ja der ewige Noob hier - dass man mit dateinamen soviel verkehrt machen kann, wusste ich nicht. ^^
ich poste mal meinen ganzen Code, weil ich noch eine Frage hab :):
#include <iostream>
#include <fstream>
using namespace std;
double* Speicher_fuer_Vektor_anlegen(int dim);
double auswertung(double * stuetz, double * baryz, double * werte, double x, int n);
double * skalierung(double links, double rechts, int m);
double * baryz_koo(double * stuetz, int n);
double runge( double x );
int main()
{
char choice;
double * stuetz, * werte, * baryz, *skal, P;
int n, i;
do
{
cout << "Aufgabenteil a, b der c? Ende mit e. ";
cin >> choice;
switch(choice)
{
/* ------------- Aufgabenteil a) ------------- */
case 'a':
n = 11;
stuetz = Speicher_fuer_Vektor_anlegen(10+1);
for(i=0; i<=10; i++)
stuetz[i] = double(i)/10.0;
werte = Speicher_fuer_Vektor_anlegen(10+1);
werte[0] = 1.0 ;
werte[1] = 0.989;
werte[2] = 0.959;
werte[3] = 0.9002;
werte[4] = 0.8101;
werte[5] = 0.691;
werte[6] = 0.5491;
werte[7] = 0.395;
werte[8] = 0.243;
werte[9] = 0.1098;
werte[10] = 0.0;
skal = skalierung(0.0, 1.0, 1000);
baryz = baryz_koo(stuetz, 10);
fstream f;
f.open("interpolation_a.dat", ios::out);
for(i=0; i<=1000; i++)
{
P = auswertung(stuetz,baryz,werte,skal[i],10);
f << skal[i] << "\t" << P << endl;
}
f.close();
cout << "Interpolation berechnet. (siehe Ordner)" << endl;
break;
/* ------------- Aufgabenteil b) ------------- */
case 'b':
int grad;
cout << "Grad?: ";
cin >> grad;
stuetz = skalierung(-5.0, 5.0, grad);
skal = skalierung(-5.0, 5.0, 1000);
werte = Speicher_fuer_Vektor_anlegen(grad + 1);
for(i=0; i <=grad; i++)
werte[i] = runge(stuetz[i]);
baryz = baryz_koo(stuetz, grad);
f.open("interpolation_b.dat", ios::out);
for(i=0; i<=1000; i++)
{
P = auswertung(stuetz,baryz,werte,skal[i],grad);
f << skal[i] << "\t" << P << endl;
}
f.close();
cout << "Interpolation berechnet. (siehe Ordner)" << endl;
}
}while(choice != 'e');
return 0;
}
double runge( double x )
{
return 1.0 / (1.0 + 5.0 * x*x);
}
double * baryz_koo(double * stuetz, int n) // Vektor hat n+1 Komponenten!
{
double * baryz = Speicher_fuer_Vektor_anlegen(n+1);
for(int i = 0; i <= n; i++)
{
baryz[i] = 1;
for(int j = 0; j <= n; j++)
if(j!=i)
baryz[i] = baryz[i]/(stuetz[i] - stuetz[j]);
}
return baryz;
}
double auswertung(double * stuetz, double * baryz, double * werte, double x, int n)
{
double l = 1.0, s = 0.0;
double y;
for(int i = 0; i <= n; i++)
{
y = x - stuetz[i];
if( y == 0)
{
return werte[i];
}
l = l * y;
s = s + baryz[i]*werte[i]/y;
}
return l*s;
}
double * skalierung(double links, double rechts, int m) // Teilt Intervall in m + 1 äquidistante Stücke
{
double * skal = Speicher_fuer_Vektor_anlegen(m+1);
for(int i = 0; i <= m; i++)
skal[i] = links + (double(i)/double(m))*rechts;
return skal;
}
double* Speicher_fuer_Vektor_anlegen(int dim)
{
double* v;
v=(double *)(calloc(dim,sizeof (double)));
if (v==NULL)
{
cout << "Nicht genuegend Speicher vorhanden!";
exit(-1);
}
return v;
}
Ist noch in Bearbeitung. Bei Zeile 58 brauche ich dann die Variable im Dateinamen. Geht das nicht einfacher, als beschrieben? *hust*
Ich kenn mich doch sowieso schon kaum aus ^^"
Wenn nicht, dann danke für die Mühe!
Meine zweite Frage bezieht sich auf den bereits erähnten Fehler beim "case 'b'" (Zeile 71), wo men Compiler "error: jump to case label" meldet.
Mit ist aufgefallen, dass der Fehler eintrit, sobald der zweite "case" nach dem dem "fstream f;" steht. Weiß das jemand zu deuten?
Dankeschön!