From b8317737c6916812f0e6d806789e8057f53255d8 Mon Sep 17 00:00:00 2001 From: maasp Date: Mon, 27 Apr 2020 21:15:31 +0200 Subject: [PATCH] Vielleicht etwas verbessert --- .../src/ComputerphysikAbgabe.c | 63 ++++++++++--------- 1 file changed, 34 insertions(+), 29 deletions(-) diff --git a/Hausaufgaben/ComputerphysikAbgabe/src/ComputerphysikAbgabe.c b/Hausaufgaben/ComputerphysikAbgabe/src/ComputerphysikAbgabe.c index 8bc34ff..30bd405 100644 --- a/Hausaufgaben/ComputerphysikAbgabe/src/ComputerphysikAbgabe.c +++ b/Hausaufgaben/ComputerphysikAbgabe/src/ComputerphysikAbgabe.c @@ -59,54 +59,59 @@ double IntRomb(double x1, double x2, int n, double a, double z, } //Speicherplatz befreien und ergebnis return - for (i = 0; i <= mmax; i++) { + for (i = 0; i <= mmax; i++) { //Speicherplatz in Schleife freigeben free(T[i]); } free(T); free(h); - return ergebnis; + return ergebnis; //Rückgabewert ist Ergebnis } double potenzial(int n, double a, double z, double (*func)(double, double, double), double eps) { - double V; - double alpha = 1/sqrt(M_PI); - double Q = 1; - V = alpha * (Q / a) * InfInt(n, a, z, eps); + double V; //Variable Potential + double alpha = 1/sqrt(M_PI); //normierung alpha + double Q = 1; //Gesamtladung Q + V = alpha * (Q / a) * InfInt(n, a, z, eps); //Potential berechnen return V; } double InfInt(int n, double a, double z, double eps) { - double x1 = -1; + double x1 = -1; //Grenzen definieren double x2 = 1; - double R; - double lastR; + double R; //Variable zum speichern des Ergebnis + double lastR; //Vergleichsvariable definieren do { - x1 = x1 * 2; - x2 = x2 * 2; - lastR = R; - R = IntRomb(x1, x2, n, a, z, f1, eps); + x1 = x1*2; //Grenzen vergrößern + x2 = x2*2; + lastR = R; //letztes Ergebnis speichern + R = IntRomb(x1, x2, n, a, z, f1, eps); //neues Ergebnis berechnen - } while (abs(lastR - R) > eps); + } while ((lastR/R<(1-eps)) || (lastR/R>(1+eps))); //Integralwerte vergleichen ,sodass deren Änderung kleiner als eps ist return R; } void efeld(double a, double z, int n, double eps, double *dfp) { - double f[2]; - double h=0.001; - eps = 0.01; - f[0] = potenzial( n, a, z +(eps*z), f1, eps); - f[1] = potenzial(n, a, z - (eps*z), f1, eps); - printf("%lf %lf", f[0], f[1]); - *dfp = -1 - * (f[0] - f[1]) / (2 * eps*z); //Differenzenquotient + double f[2]; //Array zum speichern der Funktionswerte + double h =0.5* z; //h relativ groß wird in Schleive verkleinert + double lastdf; + do { + lastdf=*dfp; + f[0] = potenzial( n, a, z +(h), f1, eps); //f(z+h) berechnen + f[1] = potenzial(n, a, z - h, f1, eps); //f(z-h) berechnen + h=h/2; //h kleiner machen + *dfp = -1* (f[0] - f[1]) / (double)(2 * h); //Differenzenquotient + } while(abs(lastdf-*dfp) > eps); //Schleife läuft solange Differenz der Ableitungen + + } int main(void) { double z, a; int n; - double eps = 1e-8; //genauigkeit epsilon - //Eingabe der Variablen - double df; + double eps = 1e-3; //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"); @@ -116,8 +121,8 @@ int main(void) { - printf("Unendliches Inegral %lf\n", InfInt(n, a, z, eps)); - printf("Das Potenzial ist %f\n", potenzial(n,a,z,f1,eps)); - efeld(a,z,n,eps,&df); - printf("Das E-Feld an der Stelle %lf ist:%f\n", z, df); + printf("Unendliches Inegral %lf\n", InfInt(n, a, z, eps)); //Integral berechnen mit InfInt + printf("Das Potenzial ist %f\n", potenzial(n,a,z,f1,eps)); //Potenzial aus Integral berechnen + efeld(a,z,n,eps,&df); //E-feld berechnen + printf("Das E-Feld an der Stelle %3.2lf ist:%f\n", z, df); }