diff --git a/Hausaufgaben/ComputerphysikAbgabe/src/ComputerphysikAbgabe.c b/Hausaufgaben/ComputerphysikAbgabe/src/ComputerphysikAbgabe.c index addef17..65e26b7 100644 --- a/Hausaufgaben/ComputerphysikAbgabe/src/ComputerphysikAbgabe.c +++ b/Hausaufgaben/ComputerphysikAbgabe/src/ComputerphysikAbgabe.c @@ -2,21 +2,21 @@ #include #include -int mmax = 10; //globale Variable, Maximale Anzahl der Schritte +int mmax = 30; //globale Variable, Maximale Anzahl der Schritte double InfInt(int n, double a, double z,double eps,double (*func)(double, double, double)); double f1(double x, double a, double z) { // Zu integrierende Funktion return (exp(-(x * x) / (a * a)) / sqrt(x * x + z * z)); } double f2(double x, double a, double z){ - return((exp(-(x*x)/(a*a))*z)/pow((x*x)+(z*z),3/2)); + return((exp(-(x*x)/(a*a))*z)/pow((x*x)+(z*z),1.5)); } double trapez(int n, double a, double z, double (*func)(double, double, double), double x1, double x2) { //Trapeze double sum; - double h = (x2 - x1) / (n - 1); + double h = (x2 - x1) / (n); //Trapezsumme für Grenzen berechnen sum = (0.5 * func(x1, a, z)) + (0.5 * func(x2, a, z)); //in der Summe Funtion aufrufen um Werte an Grenzen x1 und x2 zu bekommen - for (int i = 1; i < n - 1; i++) { + for (int i = 1; i < n; i++) { sum += func(x1 + (h * i), a, z); } return sum * h; @@ -37,7 +37,7 @@ double IntRomb(double x1, double x2, int n, double a, double z, } - h[0] = (x2 - x1) / (n - 1); //Erste Schrittweite berechnen + h[0] = (x2 - x1) / (n); //Erste Schrittweite berechnen T[0][0] = trapez(n, a, z, func, x1, x2); //erstes Trapez berechnen @@ -54,6 +54,7 @@ double IntRomb(double x1, double x2, int n, double a, double z, * T[i - 1][k - 1]); } + //printf("%d",i); if (abs(T[i][i] - T[i - 1][i - 1]) <= eps) { //Abschätzen ob das Ergebnis genau genug ist wenn ja aus Schleife raus ergebnis = T[i][i]; @@ -61,7 +62,10 @@ double IntRomb(double x1, double x2, int n, double a, double z, } } - //Speicherplatz befreien und ergebnis return + if (i==mmax){ + printf("Fehler, Integral ist ungenau"); // Fehler falls Abbruchbedingung der vorherigen Schleife nicht greift + } + //Speicherplatz befreien for (i = 0; i <= mmax; i++) { //Speicherplatz in Schleife freigeben free(T[i]); } @@ -116,15 +120,13 @@ void efeld(double a, double z, int n, double eps, } int main(void) { double z, a; - int n; + int n=30; double eps = 1e-8; //genauigkeit epsilon double df; //Variable zum speichern des Differenzenquotienten //Eingabe der Variablen: printf("Bitte geben Sie den Abstand der Punktladung von der x-Achse z ein\n "); scanf("%lf", &z); - printf("Bitte geben Sie n ein\n"); - scanf("%d", &n); printf("Bitte geben Sie a ein\n"); scanf("%lf", &a); @@ -137,7 +139,7 @@ int main(void) { printf("Das E-Feld an der Stelle %3.2lf ist:%f\n", z, df); //H2.2 Berechnung des Efeldes mit Hilfe analytischer Ableitung printf("Das E-Feld an der Stelle %3.2lf ist:%f\n", z, potenzial(n,a,z,f2,eps)); - double diff=abs(df-potenzial(n,a,z,f2,eps)); - printf("Differenz %f", diff); + double diff=fabs(df - potenzial(n,a,z,f2,eps)); + printf("Differenz %1.10f", diff); }