|
|
|
@ -3,6 +3,7 @@ |
|
|
|
#include<math.h> |
|
|
|
|
|
|
|
int mmax = 10; //globale Variable, Maximale Anzahl der Schritte |
|
|
|
double InfInt(int n, double a, double z,double eps); |
|
|
|
double f1(double x, double a, double z) { // Zu integrierende Funktion |
|
|
|
return (exp(-(x * x) / (a * a)) / sqrt(x * x + z * z)); |
|
|
|
} |
|
|
|
@ -38,7 +39,7 @@ double IntRomb(double x1, double x2, int n, double a, double z, |
|
|
|
T[0][0] = trapez(n, a, z, func, x1, x2); //erstes Trapez berechnen |
|
|
|
|
|
|
|
for (i = 1; i <= mmax; i++) { |
|
|
|
n = n * 2; //Trapeze für k=0 berechnen, indem man n vergrößert |
|
|
|
n = n * 2; //Trapeze für k=0 berechnen, indem man n vergrößert |
|
|
|
T[i][0] = trapez(n, a, z, func, x1, x2); |
|
|
|
h[i] = h[i - 1] / 2.0; //h berechnen für i>1 indem man durch 2 teilt |
|
|
|
|
|
|
|
@ -57,7 +58,7 @@ double IntRomb(double x1, double x2, int n, double a, double z, |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
//Speicherplatz befreien und ergebnis return |
|
|
|
//Speicherplatz befreien und ergebnis return |
|
|
|
for (i = 0; i <= mmax; i++) { |
|
|
|
free(T[i]); |
|
|
|
} |
|
|
|
@ -65,20 +66,39 @@ double IntRomb(double x1, double x2, int n, double a, double z, |
|
|
|
free(h); |
|
|
|
return ergebnis; |
|
|
|
} |
|
|
|
double potenzial(double x1, double x2,int n,double a,double z,double (*func) (double, double, double),double eps){ |
|
|
|
double potenzial(int n, double a, double z, |
|
|
|
double (*func)(double, double, double), double eps) { |
|
|
|
double V; |
|
|
|
double alpha=1; |
|
|
|
double Q=1; |
|
|
|
V=alpha*(Q/a)*IntRomb(x1,x2,n,a,z,f1,eps); |
|
|
|
double alpha = 1/sqrt(M_PI); |
|
|
|
double Q = 1; |
|
|
|
V = alpha * (Q / a) * InfInt(n, a, z, eps); |
|
|
|
return V; |
|
|
|
|
|
|
|
} |
|
|
|
void ableitung(double x1, double x2, double a, double z, int n,double eps, double *dfp){ |
|
|
|
double InfInt(int n, double a, double z, double eps) { |
|
|
|
double x1 = -1; |
|
|
|
double x2 = 1; |
|
|
|
double R; |
|
|
|
double lastR; |
|
|
|
do { |
|
|
|
x1 = x1 * 2; |
|
|
|
x2 = x2 * 2; |
|
|
|
lastR = R; |
|
|
|
R = IntRomb(x1, x2, n, a, z, f1, eps); |
|
|
|
|
|
|
|
} while (abs(lastR - R) > eps); |
|
|
|
return R; |
|
|
|
} |
|
|
|
void efeld(double a, double z, int n, double eps, |
|
|
|
double *dfp) { |
|
|
|
double f[2]; |
|
|
|
|
|
|
|
f[0]=potenzial(x1,x2,n,a,z+eps,f1, eps); |
|
|
|
f[1]=potenzial(x1,x2,n,a,z-eps,f1, eps); |
|
|
|
*dfp = -1*(f[0] - f[1]) / (2 * eps); //Differenzenquotient |
|
|
|
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 |
|
|
|
|
|
|
|
} |
|
|
|
int main(void) { |
|
|
|
@ -87,17 +107,17 @@ int main(void) { |
|
|
|
double eps = 1e-8; //genauigkeit epsilon |
|
|
|
//Eingabe der Variablen |
|
|
|
double df; |
|
|
|
printf("Bitte geben Sie den Abstand der Punktladung von der x-Achse z ein\n "); |
|
|
|
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); |
|
|
|
double x1 = -5; //Integralgrenzen |
|
|
|
double x2 = 5; |
|
|
|
|
|
|
|
printf("Das Integral ist %f\n", IntRomb(x1, x2, n, a, z, f1, eps)); //Ergebnis mit hilfe von IntRomb |
|
|
|
printf("Das Potenzial ist %f", potenzial(x1,x2,n,a,z,f1,eps)); |
|
|
|
ableitung(x1,x2,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)); |
|
|
|
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); |
|
|
|
} |