diff --git a/fuenfteabgabe.c b/fuenfteabgabe.c new file mode 100644 index 0000000..a3467b5 --- /dev/null +++ b/fuenfteabgabe.c @@ -0,0 +1,150 @@ +#include +#include +#include +typedef struct { + int N; + double d; + double h; + double xmin, xmax, tmin, tmax; + double j; + double n; + int jmax; + int nmax; + +} soli_param; +double *u0; +double *uj1; +void ustart(soli_param *sp) { + double N = sp->N; + double jmax = sp->jmax; + double h = sp->h; + double x = sp->xmin; + + for (int j = 0; j <= jmax; j++) { + + u0[j] = -N * (N + 1) / (pow(cosh(x), 2)); + x = x + h; + printf("%f\n", u0[j]); + + } + +} +void ujeins(soli_param *sp) { + double jmax = sp->jmax; + double d = sp->n; + double h = sp->h; + for (int j = 0; j <= jmax; j++) { + if (j == 1) { + uj1[j] = (d * 6 * u0[j] * (u0[j + 1] - u0[j - 1]) / (2 * h)) + - (d * (u0[j + 2] + 2 * u0[j - 1]) / (2 * pow(h, 3))) + + u0[j]; + + } else if (j == 0) { + uj1[j] = (d * 6 * u0[j] * (u0[j + 1] - u0[j - 1]) / (2 * h)) + - (d * (u0[j + 2]) / (2 * pow(h, 3))) + u0[j]; + + } else if (j == jmax - 1) { + uj1[j] = (d * 6 * u0[j] * (u0[j + 1] - u0[j - 1]) / (2 * h)) + - (d * (2 * u0[j - 1] - u0[j - 2]) / (2 * pow(h, 3))) + + u0[j]; + + } else if (j == jmax) { + uj1[j] = (d * 6 * u0[j] * (-u0[j - 1]) / (2 * h)) + - (d * (2 * u0[j - 1] - u0[j - 2]) / (2 * pow(h, 3))) + + u0[j]; + } else { + uj1[j] = (d * 6 * u0[j] * (u0[j + 1] - u0[j - 1]) / (2 * h)) + - (d * (u0[j + 2] + 2 * u0[j - 1] - u0[j - 2]) + / (2 * pow(h, 3))) + u0[j]; + } + + } + +} +void nextu(soli_param *sp) { + int jmax = sp->jmax; + int nmax = sp->nmax; + double d = sp->d; + double h = sp->h; + double * unm = u0; + double * un = uj1; + double unp[jmax]; + for (int n = 0; n <= nmax; n++) { + for (int j = 0; j <= jmax; j++) { + if (j == 1) { + unp[j] = 2*d*( + (un[j + 1] + un[j] + un[j - 1]) + * (un[j + 1] - un[j - 1]) / h + - (un[j + 2] - 2 * un[j + 1] + + 2 * un[j - 1]) + / (2 * pow(h, 3))) + unm[j]; + + } else if (j == 0) { + unp[j] = 2 + * d*( + (un[j + 1] + un[j]) * (un[j + 1]) / h + - (un[j + 2] - 2 * un[j + 1]) + / (2 * pow(h, 3))) + unm[j]; + + } else if (j == jmax - 1) { + unp[j] = 2 + * d*( + (un[j + 1] + un[j] + un[j - 1]) + * (un[j + 1] - un[j - 1]) / h + - (-2 * un[j + 1] + 2 * un[j - 1] + - un[j - 2]) / (2 * pow(h, 3))) + + unm[j]; + + } else if (j == jmax) { + unp[j] = 2 + * d*( + (un[j] + un[j - 1]) * (-un[j - 1]) / h + - (2 * un[j - 1] - un[j - 2]) + / (2 * pow(h, 3))) + unm[j]; + + } else { + unp[j] = 2 + * d*( + (un[j + 1] + un[j] + un[j - 1]) + * (un[j + 1] - un[j - 1]) / h + - (un[j + 2] - 2 * un[j + 1] + + 2 * un[j - 1] - un[j - 2]) + / (2 * pow(h, 3))) + unm[j]; + } + + + } + unm=un; + un=unp; + + } + FILE *fp= fopen("numplot2.csv", "w"); + double x=sp->xmin; + for(int j=0;j<=jmax;j++){ + x=x+h; + fprintf(fp, "%f\t%f\n",x,un[j]); + printf( "%f\t%f\n",x,un[j]); + + } + fclose(fp); +} + + +int main(void) { +soli_param sp; +sp.N = 2; +sp.h=0.1; +sp.d=pow(sp.h,3)/3; +sp.tmax=1; +sp.tmin=0; +sp.xmin=-30; +sp.xmax=30; +sp.jmax=(sp.xmax-sp.xmin)/sp.h; +sp.nmax=(sp.tmax-sp.tmin)/sp.d; +u0 = (double*) malloc(sp.jmax * sizeof(double)); +ustart(&sp); +uj1 = (double*) malloc(sp.jmax * sizeof(double)); +ujeins(&sp); +nextu(&sp); + +}