diff --git a/zweiteabgabe.c b/zweiteabgabe.c new file mode 100644 index 0000000..b395b7c --- /dev/null +++ b/zweiteabgabe.c @@ -0,0 +1,199 @@ +//gcc zweiteabgabe.c -o zweiteabgabe -lm -lh2_cip -L. + +#include +#include +#include +#include "h2.h" + +double ExterneKraft(double t){ + double alpha=0.5; + double w=1.5; + + return alpha*cos(w*t); + } + +double KeineKraft(double t){ + return 0; +} + +void dgl(int neq, double w0, double gamma, double *y, double *f, double t, double (*fext)(double)) +{ //für unsere DGL mit neq = 2 + //sicherstellen wie in Vorlesung:(Brauch man das wirklich? + if (neq!= 2) + { + printf ("neq passt nicht.\n"); + abort(); //Bedeutung?->Abbruch + } + //Speicherplatz muss zuvor bereitgestellt werden + f[0] = y[1]; + f[1] = -w0*w0*y[0]-2*gamma*y[1]-(fext(t)); +} + +void euler (int neq, double h, double w0, double gamma, double *y, double *f, void (*dgl) (int, double, + double, double*, double*,double,double(double)), double t, double (*fext)(double)) +{ + int i; + + dgl(neq,w0,gamma,y,f,t,fext); // Iformationen über rechte Seite holen + + //Euler-Verfahren anwenden und x_n+1 berechnen + + for (i = 0; i < neq; i++) + { + y[i] += h*f[i]; + } +} +void RK4 (int neq, double h, double w0, double gamma, double *y, double *f, void (*dgl) (int, double, + double, double*, double*,double,double(double)), double **k, double t, double (*fext)(double) ) { + int i; + double yTemp[neq]; + double tTemp; + dgl(neq,w0,gamma,y,k[0],t,fext); + for(i=0;i 0) //solange kein Nustellenübergang (bzw.Vorzeichenwechsel) zwischen x1 und x2 vorliegt + { + RK4(neq,h,w0,gamma,y,f,dgl,k,t,fext); + x1 = x2; //Wert übergeben + x2 = y[0]; + t += h; + } + RK4(neq,h,w0,gamma,y,f,dgl,k,t,fext); + x1 = x2; + x2 = y[1]; + t += h; + for (int k = 0; k < n; k++) //wird so oft durchlaufen wie die gewünschte Periodenanzahl n + { + Pges = 0; + for (int i = 0; i < 2; i++)// Zwei Durchläufe, da eine Periode durch jede zweite NST begrenzt wird + { + while (x1 * x2 > 0) + { + Pges += P(y,t,fext); //Leistung am Punkt x1(erster Punkt nach der NST, wenn nicht x1 selbst die NST ist) + t += h; + j ++; + x1 = x2; //Bestimmung der neuen x-Werte + RK4(neq,h,w0,gamma,y,f,dgl,k,t,fext); + x2 = y[0]; + } + Pges += P(y,t,fext); + j ++; + RK4(neq,h,w0,gamma,y,f,dgl,k,t,fext); + x1 = x2; + x2 = y[1]; + t += h; + } + P_Mittelwert = Pges/ j; + printf("Mittelwert der Leistung (über Periode %d): %20.5le\n", k, P_Mittelwert); + } + return 0; +} + + + +int main() +{ + double h=0.01;//0.001 + double t0=0; + double x0=1.5; + double v0=2.75; + double tend=10;//20 + int neq = 2; + + double *y, *f; + double t; + double w0=1; + double gamma=0.1; + double *k[4]; + + int n; // Dafiniere Variable für die Periodenanzahl + + /*printf("Bitte geben Sie h, t0, x0, v0 und tend, sowie omega0 und gamma ein:\n"); + scanf("%le %le %le %le %le %le %le", &h, &t0, &x0, &v0, &tend, &w0, &gamma);*/ + + y = (double*)malloc(sizeof(double)*neq); + f = (double*)malloc(sizeof(double)*neq); + //k= (double*)malloc(sizeof(double)*neq); + for(int i=0;i<4;i++){ + k[i]=(double*)malloc(sizeof(double)*neq); + } + + y[0] = x0; + y[1] = v0; + + //H4: + //FILE *fp = fopen("H6_werte", "w"); + //printf("t\tLösung x(t)\t dx(t)/dt\n"); + /*for (t = t0; t <= tend; t+=h) + { if (t==0){ + printf(" %20.5le\t%20.5le\t%20.5le\n", t, x0, v0); //brauch man das überhaupt denke nicht-> wird doppelt ausgegeben! + } + + printf(" %20.5le\t%20.5le\t%20.5le\n", t, y[0], y[1]); + + //fprintf(fp, " %20.5le\t%20.5le\t%20.5le\n", t, y[0], y[1]); + + RK4(neq,h,w0,gamma,y,f,dgl,k,t,KeineKraft); + } + */ + + //H.6: + /*for (t = t0; t <= tend; t+=h) + { + //printf(" %20.5le\t%20.5le\t%20.5le\n", t, y[0], y[1]); + + fprintf(fp, " %20.5le\t%20.5le\n", t, y[0]); + + //fprintf(fp, "%20.5le\t%20.5le\n", t, Leistung(y, t, fext)); + + RK4(neq,h,w0,gamma,y,f,dgl,k,t,fext); + //fprintf(fp,"%20.5le\t %20.5le\n",t, fext(t)); + }*/ + + printf("Bitte geben sie die Periadenanzahl an:\n"); + scanf("%d", &n); + + Leistung_Mittelwert(n,neq,h,w0,gamma,y,f,dgl,k,t,fext,Leistung); + + //fclose(fp); //Schließe Datei wieder + + free(y); free(f); + for(int i=0;i<4;i++){ + free(k[i]); + } + +}