maasp 5 years ago
parent
commit
920b5e5f9f
1 changed files with 20 additions and 11 deletions
  1. 31
      Hausaufgaben/ComputerphysikAbgabe/src/ComputerphysikAbgabe.c

31
Hausaufgaben/ComputerphysikAbgabe/src/ComputerphysikAbgabe.c

@ -3,10 +3,13 @@
#include<math.h>
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);
}
Loading…
Cancel
Save