Skip to content

Commit 376c3dd

Browse files
committed
add exercises from latest lesson, still not ported to cmake
1 parent 2c19dff commit 376c3dd

13 files changed

+676
-8
lines changed

PREREQUISITI.md

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,20 @@
1-
## Ubuntu (incluso Ubuntu On Windows)
1+
## Ubuntu On Windows
2+
Si suggerisce di utilizzare Bash on Ubuntu on Windows solo a partire dalla build 15063 (Creators Update).
3+
1) Se non è già installato nel sistema, installare [chocolatey](http://chocolatey.org)
4+
2) Se nel sistema Windows non è già presente un server X, installarlo con questa procedura: aprire Powershell in modalità amministratore e quindi digitare
5+
```
6+
PS \> cinst -y vcxsrv
7+
```
8+
3) Se non ancora abilitato, attivare UoW seguendo la [guida ufficiale](https://msdn.microsoft.com/it-it/commandline/wsl/install_guide)
9+
4) Seguire la guida per Ubuntu
10+
11+
12+
13+
## Ubuntu
214
Aprire un terminale bash e digitare
315
```
4-
$ sudo apt-get install g++ gnuplot cmake make libfltk1.3-dev libboost-all-dev git
16+
$ sudo apt-get update
17+
$ sudo apt-get install g++ gnuplot cmake make libfltk1.3-dev freeglut3-dev libboost-all-dev git imagemagick
518
```
619

720

@@ -10,16 +23,19 @@ $ sudo apt-get install g++ gnuplot cmake make libfltk1.3-dev libboost-all-dev g
1023
```
1124
$ xcode-select --install
1225
```
13-
2) Installare Homebrew secondo la guida presente sulla [homepage](https://brew.sh/index_it.html).
26+
2) Se non ancora installato, installare Homebrew secondo la guida presente sulla [homepage](https://brew.sh/index_it.html).
1427
3) Aprire infine un terminale e digitare
1528
```
29+
$ brew update
1630
$ brew install gnuplot cmake make fltk boost git
31+
$ brew install imagemagick --with-x11
1732
```
1833

34+
1935
## Windows (7+)
20-
1) Installare [Visual Studio 2017 Community](http://visualstudio.com).
21-
2) Installare [chocolatey](http://chocolatey.org)
22-
3) Aprire Powershell in modalità amministratore e quindi digitare
36+
1) Se mancante, installare [Visual Studio 2017 Community](http://visualstudio.com).
37+
2) Se non installato, installare [chocolatey](http://chocolatey.org)
38+
3) Se non avete gnuplot e un client git installati, aprire Powershell in modalità amministratore e quindi digitare
2339
```
2440
PS \> cinst -y gnuplot git
2541
```
@@ -28,7 +44,7 @@ PS \> cinst -y gnuplot git
2844
PS \> rundll32 sysdm.cpl,EditEnvironmentVariables
2945
```
3046
5) Nella schermata che si apre, nella sezione superiore, creare una nuova variabile con nome WORKSPACE e come valore il path completo della nostra cartella di lavoro precedentemente stabilita
31-
6) Chiudere la Powershell e riaprirla, sempre in modalità utente standard
47+
6) Se vcpkg non è installato, eseguire la procedura seguente, altrimenti saltare direttamente al punto 8. Chiudere la Powershell e riaprirla, sempre in modalità utente standard
3248
```
3349
PS \> cd $env:WORKSPACE
3450
PS Codice> git clone https://github.com/Microsoft/vcpkg.git
@@ -45,7 +61,7 @@ PS Codice\vcpkg> .\vcpkg integrate install
4561
```
4662
PS \> cd $env:WORKSPACE
4763
PS Codice> cd vcpkg
48-
PS Codice\vcpkg> .\vcpkg install fltk boost
64+
PS Codice\vcpkg> .\vcpkg install fltk boost freeglut opengl
4965
```
5066
nb: per completare quest'ultimo passaggio bisogna accettare l'installazione di "CMake portable"
5167

integratori/Bat_eq_diff_Kutta.sh

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
g++ -o eq_diff_Kutta.exe eq_diff_Kutta.cpp
2+
./eq_diff_Kutta.exe
3+
gnuplot Plot_eq_diff_orbits.plt
4+
display Fig.png &
5+
gnuplot Plot_eq_diff_Kutta_er.plt
6+
display Fig2.png &

integratori/Bat_eq_diff_orbits.sh

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
g++ -o eq_diff_orbits.exe eq_diff_orbits.cpp
2+
./eq_diff_orbits.exe
3+
gnuplot Plot_eq_diff_orbits.plt
4+
display Fig.png &
5+
gnuplot Plot_eq_diff_orbits_3.plt
6+
display Fig2.png &

integratori/Bat_eq_diff_strobo.sh

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
g++ -o eq_diff_strobo.exe eq_diff_strobo.cpp
2+
./eq_diff_strobo.exe
3+
gnuplot Plot_eq_diff_orbits.plt
4+
display Fig.png &
5+
gnuplot Plot_eq_diff_strobo_2.plt
6+
display Fig2.png &

integratori/Plot_eq_diff_Kutta_er.plt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#!/gnuplot
2+
FILE="fort.2"
3+
set terminal png enhanced
4+
set output 'Fig2.png'
5+
# set terminal postscript eps enhanced colour solid rounded "Helvetica" 25
6+
# set output 'fig.ps'
7+
set title " Runge-Kutta errore su H "
8+
set xlabel " t "
9+
set ylabel " err "
10+
# set xrange [-1:1]
11+
# set yrange [-1:1]
12+
set logscale y
13+
set format y '10^{%L}'
14+
plot FILE u 1:2 w lines lt 1 lc rgb "blue" lw 2 t ' RK '

integratori/Plot_eq_diff_orbits.plt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#!/gnuplot
2+
FILE="fort.1"
3+
set terminal png enhanced
4+
set output 'Fig.png'
5+
# set terminal postscript eps enhanced colour solid rounded "Helvetica" 25
6+
# set output 'fig.ps'
7+
set title " Integratori per H(q,p) "
8+
set xlabel " x "
9+
set ylabel " p "
10+
11+
12+
13+
a=10 # pend campo cost
14+
a=0.5 # pot cubico Henon
15+
a=2 # double well
16+
a=3.1415 # pend
17+
18+
set xrange [-a:a]
19+
set yrange [-a:a]
20+
set arrow from -a,0 to a,0 lw 1 lc rgb "black" nohead
21+
set arrow from 0,-a to 0,a lw 1 lc rgb "black" nohead
22+
# set logscale y
23+
# set format y '10^{%L}'
24+
plot FILE u 2:3 w points pt 1 lc rgb "blue" ps 0.2 t ' ' # ,\

integratori/Plot_eq_diff_orbits_3.plt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#!/gnuplot
2+
FILE="fort.2"
3+
set terminal png enhanced
4+
set output 'Fig2.png'
5+
# set terminal postscript eps enhanced colour solid rounded "Helvetica" 25
6+
# set output 'fig.ps'
7+
set title " Integratori per H(q,p) errore "
8+
set xlabel " t "
9+
set ylabel " err "
10+
# set xrange [0:1]
11+
# set yrange [-1:1]
12+
set logscale y
13+
set format y '10^{%L}'
14+
plot FILE u 2:(abs($3)) w lines lt 1 lc rgb "cyan" lw 2 t ' sym 1 ' ,\
15+
FILE u 2:(abs($4)) w lines lt 1 lc rgb "blue" lw 2 t ' sym 2 ' ,\
16+
FILE u 2:(abs($5)) w lines lt 1 lc rgb "green" lw 2 t ' sym 4 ' ,\
17+
FILE u 2:(abs($6)) w lines lt 1 lc rgb "purple" lw 2 t ' sym 6 ' ,\
18+
FILE u 2:(abs($7)) w lines lt 1 lc rgb "red" lw 2 t ' sym 8 '

integratori/Plot_eq_diff_strobo_2.plt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#!/gnuplot
2+
FILE="fort.2"
3+
set terminal png enhanced
4+
set output 'Fig2.png'
5+
# set terminal postscript eps enhanced colour solid rounded "Helvetica" 25
6+
# set output 'fig.ps'
7+
set title " Integratori per H(q,p,t) errore "
8+
set xlabel " t "
9+
set ylabel " err "
10+
# set xrange [-1:1]
11+
# set yrange [-1:1]
12+
set logscale y
13+
set format y '10^{%L}'
14+
plot FILE u 1:2 w lines lt 1 lc rgb "green" lw 2 t ' sym 4 '

integratori/eq_diff_Kutta.cpp

Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
2+
#define _CRT_SECURE_NO_WARNINGS
3+
// Inclusioni
4+
#include <complex>
5+
#include <cstdio>
6+
#include <cmath>
7+
#include <iostream>
8+
#include <fstream>
9+
#include <iomanip>
10+
// Fine inclusioni
11+
using namespace std;
12+
13+
/* Integra con Runge-Kutta la doppia buca con dipendenza periodica dal tempo.
14+
Si fa l'analisi stroboscopica tracciando i punti ad ogni periodo.
15+
Quando tale dipendenza nonc'è eps=0 si valut al'integrale primo e si vede che
16+
l'errore su H cresce in modo monotono */
17+
18+
19+
double ome=1.;
20+
double el=0.02; // variabili globali
21+
double eps=0.; // 0 no dip tempo, 0.02 quasi regolare 0.05 caos debole 0.2 caos forte
22+
23+
24+
25+
void Phi(double &t, double &x, double &p, double &fx, double &fp)
26+
{ fx = p ;
27+
fp = x -x*x*x *(1+eps*cos(ome*t));}
28+
29+
void Kutta(double &xx, double &yy, double &t, double dt)
30+
{ double K1[3], K2[3], K3[3], K4[3];
31+
double fx, fy, x, y;
32+
33+
x=xx;
34+
y=yy;
35+
Phi( t, x, y, fx, fy);
36+
K1[1]= fx;
37+
K1[2]= fy;
38+
39+
40+
41+
double h=0.5*dt;
42+
double t1=t+h ;
43+
x=xx+ h*K1[1];
44+
y=yy+ h*K1[2];
45+
Phi( t1, x, y, fx, fy);
46+
K2[1]= fx;
47+
K2[2]= fy;
48+
49+
x=xx+ h*K2[1];
50+
y=yy+ h*K2[2];
51+
Phi( t1, x, y, fx, fy);
52+
K3[1]= fx;
53+
K3[2]= fy;
54+
55+
double t2=t+dt;
56+
57+
x=xx+ dt*K3[1];
58+
y=yy+ dt*K3[2];
59+
Phi( t2, x, y, fx, fy);
60+
K4[1]= fx;
61+
K4[2]= fy;
62+
63+
xx=xx + (K1[1]+2*K2[1] +2*K3[1] +K4[1] ) *dt/6 ;
64+
yy=yy + (K1[2]+2*K2[2] +2*K3[2] +K4[2] ) *dt/6 ;
65+
t=t+dt;
66+
67+
// cout << setw(18) << t << setw(18) << xx << setw(18) <<yy << endl ;
68+
// cout << " " << endl;
69+
70+
}
71+
72+
73+
74+
75+
/* Hamiltoniano */
76+
double H( double &x, double &p ) // x, p non vengono aggiornate &x, &p vengono aggiornate
77+
{ double H, V;
78+
// Hamiltoniano potenziale a doppia buca
79+
V = -x*x/2 + x*x*x*x/4;
80+
H= p*p/2 + V;
81+
return H;}
82+
83+
84+
85+
86+
87+
int main( )
88+
{ double x, p , t ;
89+
double E0;
90+
int N_step=100; // passi per periodo
91+
int N_per= 1000; // numero periodi
92+
int k_max= N_per*N_step; // numero totale time steps
93+
94+
double x0 , p0 ; // condizioni inizilai
95+
double pi=4*atan(1.);
96+
double T_per= 2*pi/ome;
97+
double dt= T_per/N_step ; // *sqrt(2.) ;
98+
99+
double a=-2, b=2;
100+
int Nx=20;
101+
double dx=(b-a)/Nx;
102+
ofstream St ("fort.1"); // apre il file fort.1
103+
ofstream St2 ("fort.2"); // apre il file fort.2
104+
105+
for(int ix=1; ix< Nx ; ix++)
106+
{ // ----------------------------> loop ix cond. iniz.
107+
108+
t=0;
109+
St << " " << endl ;
110+
111+
x0=a+dx*ix ;
112+
p0=x0*0.2;
113+
114+
x=x0;
115+
p=p0;
116+
117+
St << setw(18) << t << setw (18) << scientific << x << setw (18) << p << endl;
118+
119+
cout << setw (18) << x0 << setw (18) << p0 << endl;
120+
121+
E0=H(x,p);
122+
123+
t=0;
124+
125+
126+
for(int k=1; k<k_max ; k++)
127+
{ // ----------> inizio loop k per evol. temporale
128+
129+
Kutta(x,p,t,dt); // chiamata a integratore
130+
131+
132+
133+
int m_per=k/N_step;
134+
int ir=k-m_per*N_step ;
135+
136+
137+
if(ir==0) { // ....... inizio if per analisi stroboscopica
138+
139+
140+
double E=H(x,p);
141+
double er= abs(1-E/E0);
142+
double xx=x;
143+
144+
/* si riportano le orbite tra -pi e pi
145+
double duepi=2*pi;
146+
double xx=x/duepi;
147+
int Int_xx=xx; // questo serve solo per il pendolo
148+
xx=xx-Int_xx;
149+
if(xx>0.5) {xx=xx-1;}
150+
if(xx<-0.5) {xx=xx+1;}
151+
xx=xx*duepi;
152+
// fine riporto */
153+
154+
155+
// cout << m_per << ir << setw (18) << scientific << t << endl ;
156+
157+
St << setw(18) << t << setw (18) << scientific << xx << setw (18) << p << setw (18) << er << setw(18) << t << endl ;
158+
159+
if(ix == 3) {
160+
St2 << setw(18) << t << setw (18) << scientific << er << endl ; }
161+
162+
} // ......... fine if periodo
163+
164+
} // <----------- fine loop k
165+
} // <-------------------------- fine loop ix
166+
St.close();
167+
St2.close();
168+
} // fine main

0 commit comments

Comments
 (0)