From 920b5e5f9fa9621dd0280155ce122f6186ff34a9 Mon Sep 17 00:00:00 2001 From: maasp Date: Fri, 1 May 2020 19:57:50 +0200 Subject: [PATCH] H2b --- .../src/ComputerphysikAbgabe.c | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/Hausaufgaben/ComputerphysikAbgabe/src/ComputerphysikAbgabe.c b/Hausaufgaben/ComputerphysikAbgabe/src/ComputerphysikAbgabe.c index b992c52..addef17 100644 --- a/Hausaufgaben/ComputerphysikAbgabe/src/ComputerphysikAbgabe.c +++ b/Hausaufgaben/ComputerphysikAbgabe/src/ComputerphysikAbgabe.c @@ -3,10 +3,13 @@ #include int mmax = 10; //globale Variable, Maximale Anzahl der Schritte -double InfInt(int n, double a, double z,double eps); +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)); +} double trapez(int n, double a, double z, double (*func)(double, double, double), double x1, double x2) { //Trapeze double sum; @@ -71,32 +74,32 @@ double potenzial(int n, double a, double z, 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 + V = alpha * (Q / a) * InfInt(n, a, z, eps,func); //Potential berechnen return V; } -double InfInt(int n, double a, double z, double eps) { +double InfInt(int n, double a, double z, double eps,double (*func)(double, double, double)) { double x1 = -1; //Grenzen definieren double x2 = 1; - double R=IntRomb(x1,x2,n,a,z,f1,eps); //Variable zum speichern des Ergebnis, Integral für erste Grenzen ausrechnen + double R=IntRomb(x1,x2,n,a,z,func,eps); //Variable zum speichern des Ergebnis, Integral für erste Grenzen ausrechnen double lastR; //Vergleichsvariable definieren do { lastR = R;//letztes Ergebnis speichern x1 = x1*2; //Grenzen vergrößern x2 = x2*2; - R = IntRomb(x1, x2, n, a, z, f1, eps); //neues Ergebnis berechnen + R = IntRomb(x1, x2, n, a, z, func, eps); //neues Ergebnis berechnen } 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 *dfp,double (*func)(double, double, double)) { double f[2]; //Array zum speichern der Funktionswerte - double h =0.5* z; //h relativ groß wird in Schleive verkleinert + double h =0.5* z; //h relativ groß wird in Schleife verkleinert double lastdf; - 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 + f[0] = potenzial( n, a, z +(h), func, eps); //f(z+h) berechnen + f[1] = potenzial(n, a, z - h, func, eps); //f(z-h) berechnen *dfp = -1* (f[0] - f[1]) / (double)(2 * h); do { h=h/2; //h kleiner machen @@ -127,8 +130,14 @@ int main(void) { - printf("Unendliches Inegral %lf\n", InfInt(n, a, z, eps)); //Integral berechnen mit InfInt + printf("Unendliches Inegral %lf\n", InfInt(n, a, z, eps,f1)); //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 + //H2.1 Berechnung des Efeldes mit Hilfe numerischer Ableitung + efeld(a,z,n,eps,&df,f1); //E-feld berechnen 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); + }