Browse Source

Vielleicht etwas verbessert

master
maasp 5 years ago
parent
commit
b8317737c6
1 changed files with 34 additions and 29 deletions
  1. 63
      Hausaufgaben/ComputerphysikAbgabe/src/ComputerphysikAbgabe.c

63
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);
}
Loading…
Cancel
Save