commit
ab9d0c1e2f
1 changed files with 85 additions and 0 deletions
Split View
Diff Options
@ -0,0 +1,85 @@ |
|||
#include <stdio.h> |
|||
#include <stdlib.h> |
|||
#include<math.h> |
|||
|
|||
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)); |
|||
|
|||
} |
|||
Write
Preview
Loading…
Cancel
Save