commit ab9d0c1e2fe8861f1b8cfcb916f988675c6217d6 Author: maasp Date: Sat Apr 25 17:58:22 2020 +0200 Hallo ich bin Pauline und ich kann gut singen diff --git a/Hausaufgaben/ComputerphysikAbgabe/src/ComputerphysikAbgabe.c b/Hausaufgaben/ComputerphysikAbgabe/src/ComputerphysikAbgabe.c new file mode 100644 index 0000000..f190a84 --- /dev/null +++ b/Hausaufgaben/ComputerphysikAbgabe/src/ComputerphysikAbgabe.c @@ -0,0 +1,85 @@ +#include +#include +#include + +int mmax = 10; //globale Variable, Maximale Anzahl der Schritte +double f1(double x, double a, double z) { // Zu integrierende Funktion + return (exp(-(x * x) / (a * a)) / sqrt(x * x + z * z)); +} +double trapez(int n, double a, double z, double (*func)(double, double, double), + double x1, double x2) { //Trapeze + double sum; + double h = (x2 - x1) / (n - 1); + //Trapezsumme für Grenzen berechnen + sum = (0.5 * func(x1, a, z)) + (0.5 * func(x2, a, z)); //in der Summe Funtion aufrufen um Werte an Grenzen x1 und x2 zu bekommen + for (int i = 1; i < n - 1; i++) { + sum += func(x1 + (h * i), a, z); + } + return sum * h; +} + +double IntRomb(double x1, double x2, int n, double a, double z, + double (*func)(double, double, double), int eps) { + int i, k; //Variablen für Schleifen + double ergebnis; //zum speichern des Ergebnis + double **T; //Trapezsummen (später als 2-dim Array) + double *h; //Schrittweiten Array + + h = (double*) malloc((mmax + 1) * sizeof(double)); //Speicherplatz für Array allozieren + T = (double**) malloc(((mmax + 1)) * sizeof(double*)); + + for (i = 0; i <= mmax; i++) { + T[i] = (double*) malloc(((mmax + 1)) * sizeof(double)); //Speicherplatz für 2-dim Array allozieren + + } + + h[0] = (x2 - x1) / (n - 1); //Nullter + + T[0][0] = trapez(n, a, z, f1, x1, x2); + + for (i = 1; i <= mmax; i++) { + n = n * 2; + T[i][0] = trapez(n, a, z, func, x1, x2); + h[i] = h[i - 1] / 2.0; + + for (k = 1; k <= i; k++) { + + T[i][k] = (-h[i - k] * h[i - k] + / ((h[i] * h[i]) - (h[i - k] * h[i - k])) * T[i][k - 1]) + + (h[i] * h[i] / (h[i] * h[i] - h[i - k] * h[i - k]) + * T[i - 1][k - 1]); + + } + if (abs(T[i][i] - T[i - 1][i - 1]) <= eps) { + ergebnis = T[i][i]; + + break; + } + + } + + for (i = 0; i <= mmax; i++) { + free(T[i]); + } + free(T); + free(h); + return ergebnis; +} + +int main(void) { + double z, a; + int n; + int eps = 1e-8; + printf( + "Bitte geben Sie den Abstand der Punktladung von der x-Achse z ein \n"); + scanf("%lf \n", &z); + printf("Bitte geben Sie n ein \n"); + scanf("%d\n", &n); + printf("Bitte geben Sie a ein\n"); + scanf("%lf\n ", &a); + double x1 = -5; + double x2 = 5; + + printf("Ende %f\n", IntRomb(x1, x2, 20, a, z, f1, eps)); + +}