pendulum.c

14
pendulum.c Thomas Baumgartner, Mat.nr. 0425162 Alexander Gross, Mat.nr. 0425230

description

pendulum.c. Thomas Baumgartner, Mat.nr. 0425162 Alexander Gross, Mat.nr. 0425230. q (t) durch Integration mit CVODE berechnen Phasenraumpunkte (A, w ) bestimmen, für die das Pendel stehen bleibt. Aufgabenstellung. m. q. L. Reduktion auf 1. Ordnung. N_Vector y. N_Vector ydot. - PowerPoint PPT Presentation

Transcript of pendulum.c

Page 1: pendulum.c

pendulum.c

Thomas Baumgartner, Mat.nr. 0425162

Alexander Gross, Mat.nr. 0425230

Page 2: pendulum.c

Aufgabenstellung

(t) durch Integration mit CVODE berechnen

Phasenraumpunkte (A, ) bestimmen, für die das Pendel stehen bleibt tAth sin

m

L

0sinsin1 2 ttAgL

t

Page 3: pendulum.c

Reduktion auf 1. Ordnung

12

2

21

2

1

sinsin1

ytAgL

ty

tyty

tty

tty

N_Vector y

N_Vector ydot

Page 4: pendulum.c

Rechte Seite der Gleichung

static void f(integer N, real t, N_Vector y, N_Vector ydot, void *f_data)

{

double* v_y;

double* v_ydot;

v_y = N_VDATA(y);

v_ydot = N_VDATA(ydot);

v_ydot[0] = v_y[1];

v_ydot[1] = (1/L)*(g-A*pow(w,2)*sin(w*t))*sin(v_y[0]);

}

Page 5: pendulum.c

Betriebsarten

(A, ) bestimmen

Parameter:

A1, A2, 1, 2, Ares, res, 0

Ausgabedatei: phasespace.dat

(t) berechnen

Parameter:

A, , 0

Ausgabedatei: theta.dat

Page 6: pendulum.c

Ablauf: (t) berechnen

Programm mit gewünschten Parametern aufrufen

Integration von t = 0 bis t = 10 s mittels linearem Solver CVSPGMR und Adams-Methode

Ausgabe in Datei theta.dat für jeden berechneten Zeitpunkt

Page 7: pendulum.c

Code: (t) berechnen

cvode_mem = CVodeMalloc(NEQ, f, T0, y, ADAMS, FUNCTIONAL, SS, &reltol, &abstol, fdata, NULL, FALSE, NULL, NULL, NULL);

if(cvode_mem == NULL) { printf("CVodeMalloc failed.\n"); return(1); }

while(t <= Tend){

flag = CVode(cvode_mem, TSTEP, y, &t, ONE_STEP);

if (flag != SUCCESS) { printf("CVode failed, flag =

%d.\n", flag); return(1); }

fprintf(fout, "%e %e %e\n", t, v_y[0], v_y[1]);

++timeSteps;

}

Page 8: pendulum.c

Beispiel: (t) berechnen

./pendulum 0.2 10 0.02

Calculating Theta(t) with the following parameters:

A = 0.150000

w = 70.000000

Th0 = 0.020000

Integration finished. 9994 time steps calculated.

Page 9: pendulum.c

Beispiel: (t) berechnen

Page 10: pendulum.c

Ablauf: (A, ) bestimmen

Programm mit gewünschten Parametern aufrufen

Schleifen für die Wertebereiche von A und werden durchlaufen

Integration von t = 0 bis t = 10 s für jedes (A, )-Wertepaar (CVSPGMR mit Adams-Methode)

Page 11: pendulum.c

Ablauf: (A, ) bestimmen

Stabilitätskriterium 1:

Stabilitätskriterium 2:

Ausgabe in Datei phasespace.dat für jedes Wertepaar (A, ) mit stabiler Lösung

50 t

00 t

Page 12: pendulum.c

Code: (A, ) bestimmenwhile((t <= Tend)&&(flagStable == 1)){ . . .

if (fabs(v_y[0] - Th0) > ThTOL){

flagStable = 0;

}

}

if (flagStable == 1){ . . .

if (fabs(ThAvg - Th0) <= ThAvgTol){

printf("Stable solution found: A = %f, w = %f\n", A, w);

fprintf(fout, "%e %e\n", A, w);

++stablePoints;

}

}

Page 13: pendulum.c

Beispiel: (A, ) bestimmen./pendulum 0 1 0 100 0.01 0.5 0.02

Searching phase space for stable solutions with the following parameters:

A = 0.000000 ... 1.000000

w = 0.000000 ... 100.000000

Ares = 0.010000

wres = 0.500000

Th0 = 0.020000

Stable solution found: A = 0.060000, w = 87.000000

Stable solution found: A = 0.060000, w = 94.000000 . . .

Phase space analysis finished. 1388 stable solutions found.

Page 14: pendulum.c

Beispiel: (A, ) bestimmen