Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
U
uva
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Taddeüs Kroes
uva
Commits
5d96e4ca
Commit
5d96e4ca
authored
14 years ago
by
Taddeüs Kroes
Browse files
Options
Downloads
Patches
Plain Diff
ModSim ass3: worked on report.
parent
7c1173db
No related branches found
No related tags found
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
modsim/ass3/main.c
+21
-9
21 additions, 9 deletions
modsim/ass3/main.c
modsim/ass3/plot.py
+1
-1
1 addition, 1 deletion
modsim/ass3/plot.py
modsim/ass3/report/report.tex
+69
-2
69 additions, 2 deletions
modsim/ass3/report/report.tex
with
91 additions
and
12 deletions
modsim/ass3/main.c
+
21
−
9
View file @
5d96e4ca
...
@@ -5,7 +5,7 @@
...
@@ -5,7 +5,7 @@
#include
"models.h"
#include
"models.h"
#include
"logger.h"
#include
"logger.h"
#define DEFAULT_DT .
0
01
#define DEFAULT_DT .01
#define COMPARE_DT 1.0
#define COMPARE_DT 1.0
#define INTEGRATE(method, t0, t1, dt, N, FN) { \
#define INTEGRATE(method, t0, t1, dt, N, FN) { \
...
@@ -28,26 +28,38 @@ int main(int argc, char **argv) {
...
@@ -28,26 +28,38 @@ int main(int argc, char **argv) {
args_forced_osc
[
3
]
=
{
1
.
0
,
0
.
1
,
2
.
0
},
// {k, D, w}
args_forced_osc
[
3
]
=
{
1
.
0
,
0
.
1
,
2
.
0
},
// {k, D, w}
args_lottka_volt
[
4
]
=
{.
5
,
1
.
0
,
.
1
,
.
1
},
// {a, b, c, d}
args_lottka_volt
[
4
]
=
{.
5
,
1
.
0
,
.
1
,
.
1
},
// {a, b, c, d}
args_modified_pp
[
5
]
=
{.
5
,
1
.
0
,
.
1
,
.
1
,
100
.
0
},
// {a, b, c, d, y_m}
args_modified_pp
[
5
]
=
{.
5
,
1
.
0
,
.
1
,
.
1
,
100
.
0
},
// {a, b, c, d, y_m}
args_pid_control
[
5
]
=
{
-
2
.
0
,
-
1
.
0
,
.
1
,
10
.
0
,
.
0
01
},
// {P, D, a, M, d}
args_pid_control
[
5
]
=
{
-
2
.
0
,
-
1
.
0
,
.
1
,
10
.
0
,
0
.
1
},
// {P, D, a, M, d}
*
args_gilpin
=
NULL
;
*
args_gilpin
=
NULL
;
switch
(
atoi
(
argv
[
1
])
)
{
switch
(
atoi
(
argv
[
1
])
)
{
case
0
:
case
0
:
y0
[
0
]
=
10
.
0
;
y0
[
1
]
=
20
.
0
;
logfile
=
fopen
(
"report/osc_euler"
,
"w"
);
logfile
=
fopen
(
"report/osc_euler"
,
"w"
);
puts
(
"Integrating Euler method..."
);
puts
(
"Integrating Euler method..."
);
INTEGRATE
(
Euler
,
.
0
,
4
0
.
0
,
COMPARE_DT
,
2
,
osc
);
INTEGRATE
(
Euler
,
.
0
,
10
0
.
0
,
COMPARE_DT
,
2
,
osc
);
logger_close
();
logger_close
();
logfile
=
fopen
(
"report/osc_rk2"
,
"w"
);
logfile
=
fopen
(
"report/osc_rk2"
,
"w"
);
puts
(
"Integrating Runge-Kutta 2 method..."
);
puts
(
"Integrating Runge-Kutta 2 method..."
);
INTEGRATE
(
RungeKutta2
,
.
0
,
4
0
.
0
,
COMPARE_DT
,
2
,
osc
);
INTEGRATE
(
RungeKutta2
,
.
0
,
10
0
.
0
,
COMPARE_DT
,
2
,
osc
);
logger_close
();
logger_close
();
logfile
=
fopen
(
"report/osc_rk4"
,
"w"
);
logfile
=
fopen
(
"report/osc_rk4"
,
"w"
);
puts
(
"Integrating Runge-Kutta 4 method..."
);
puts
(
"Integrating Runge-Kutta 4 method..."
);
INTEGRATE
(
RungeKutta4
,
.
0
,
4
0
.
0
,
COMPARE_DT
,
2
,
osc
);
INTEGRATE
(
RungeKutta4
,
.
0
,
10
0
.
0
,
COMPARE_DT
,
2
,
osc
);
break
;
break
;
case
1
:
INTEGRATE
(
RungeKutta4
,
.
0
,
20
.
0
,
DEFAULT_DT
,
2
,
forced_osc
);
break
;
case
1
:
INTEGRATE
(
RungeKutta4
,
.
0
,
30
.
0
,
DEFAULT_DT
,
2
,
forced_osc
);
break
;
case
2
:
INTEGRATE
(
RungeKutta4
,
.
0
,
20
.
0
,
DEFAULT_DT
,
2
,
lottka_volt
);
break
;
case
2
:
case
3
:
INTEGRATE
(
RungeKutta4
,
.
0
,
20
.
0
,
DEFAULT_DT
,
2
,
modified_pp
);
break
;
y0
[
0
]
=
0
.
5
;
y0
[
1
]
=
1
.
0
;
//y0[0] = 50.0;
//y0[1] = 100.0;
INTEGRATE
(
RungeKutta4
,
.
0
,
400
.
0
,
DEFAULT_DT
,
2
,
lottka_volt
);
break
;
case
3
:
y0
[
0
]
=
0
.
5
;
y0
[
1
]
=
1
.
0
;
//y0[0] = 50.0;
//y0[1] = 100.0;
INTEGRATE
(
RungeKutta4
,
.
0
,
100
.
0
,
DEFAULT_DT
,
2
,
modified_pp
);
break
;
case
4
:
case
4
:
y0
[
0
]
=
.
0
;
// = v(0)
y0
[
0
]
=
.
0
;
// = v(0)
y0
[
1
]
=
3
.
0
;
// = s(0)
y0
[
1
]
=
3
.
0
;
// = s(0)
...
@@ -60,7 +72,7 @@ int main(int argc, char **argv) {
...
@@ -60,7 +72,7 @@ int main(int argc, char **argv) {
s_buf
[
i
]
=
y0
[
1
];
s_buf
[
i
]
=
y0
[
1
];
}
}
INTEGRATE
(
RungeKutta4
,
.
0
,
1
0
0
.
0
,
DEFAULT_DT
,
2
,
pid_control
);
INTEGRATE
(
RungeKutta4
,
.
0
,
1
5
0
.
0
,
DEFAULT_DT
,
2
,
pid_control
);
free
(
v_buf
);
free
(
v_buf
);
free
(
s_buf
);
free
(
s_buf
);
break
;
break
;
...
...
This diff is collapsed.
Click to expand it.
modsim/ass3/plot.py
+
1
−
1
View file @
5d96e4ca
...
@@ -19,7 +19,7 @@ for i in range(len(lines)):
...
@@ -19,7 +19,7 @@ for i in range(len(lines)):
figure
(
1
)
figure
(
1
)
clf
()
clf
()
for
i
in
range
(
len
(
y
)):
for
i
in
range
(
len
(
y
)):
plot
(
x
,
y
[
i
],
'
x
'
)
plot
(
x
,
y
[
i
],
'
-
'
)
if
len
(
argv
)
==
2
:
if
len
(
argv
)
==
2
:
savefig
(
argv
[
1
])
savefig
(
argv
[
1
])
show
()
show
()
This diff is collapsed.
Click to expand it.
modsim/ass3/report/report.tex
+
69
−
2
View file @
5d96e4ca
...
@@ -25,7 +25,8 @@
...
@@ -25,7 +25,8 @@
De opdracht bestaat uit twee delen: het eerste deel betreft het implementeren
De opdracht bestaat uit twee delen: het eerste deel betreft het implementeren
van de Euler- en Runge-Kutta-methoden, in het tweede deel worden deze methoden
van de Euler- en Runge-Kutta-methoden, in het tweede deel worden deze methoden
vergeleken en gebruikt om enkele ODE's te benaderen.
vergeleken en gebruikt om enkele ODE's te benaderen. De opdrahchten zelf zullen
we niet heel uitgebreid bespreken, alleen de antwoorden die we erop hebben.
\section
{
Implementatie
}
\section
{
Implementatie
}
...
@@ -78,7 +79,7 @@ De vergelijking van de drie integratiemethoden kan worden uitgevoerd met:
...
@@ -78,7 +79,7 @@ De vergelijking van de drie integratiemethoden kan worden uitgevoerd met:
$
sh ./compare
_
osc.sh
$
sh ./compare
_
osc.sh
\end{verbatim}
\end{verbatim}
In de volgende grafieken staan hiervan de resultaten (blauw
\begin{figure}
[H]
\begin{figure}
[H]
\includegraphics
[scale=.5]
{
osc
_
euler.pdf
}
\includegraphics
[scale=.5]
{
osc
_
euler.pdf
}
...
@@ -99,15 +100,81 @@ In de volgende grafieken staan hiervan de resultaten (blauw
...
@@ -99,15 +100,81 @@ In de volgende grafieken staan hiervan de resultaten (blauw
\subsection
{
Lottka-Voltera
}
\subsection
{
Lottka-Voltera
}
We hebben de Lotka-Volterra simulatie met de opgegeven constanten uitgevoerd
voor verschillende startwaarden. De ene keer met startwaarden op het ``stabiele
punt'' en de andere keer met startwaarden daar ver vandaan. Het stabiele punt
ligt op
$
y
=
\frac
{
a
}{
b
}
=
0
.
5
$
en
$
x
=
\frac
{
c
}{
d
}
=
1
.
0
$
.
\begin{figure}
[H]
\includegraphics
[scale=.5]
{
lot
_
vol
_
close.pdf
}
\caption
{$
x
(
0
)
=
0
.
5
$
,
$
y
(
0
)
=
1
.
0
$}
\end{figure}
\begin{figure}
[H]
\includegraphics
[scale=.5]
{
lot
_
vol
_
far.pdf
}
\caption
{$
x
(
0
)
=
100
$
,
$
y
(
0
)
=
200
$}
\end{figure}
We zien dat de grafiek bij de hoge waardes een kleiner periode heeft, dus vaker
fluctueert. Bij het stabiele punt zijn er grotere periodes, waardoor de prooi
sneller een groot aantal krijgt.
\subsection
{
Modified predator-prey model
}
\subsection
{
Modified predator-prey model
}
We gebruiken exact dezelfde startwaarden als bij Lotka-Volterra en nu krijgen
het volgende resultaat:
\begin{figure}
[H]
\includegraphics
[scale=.5]
{
mod
_
pp
_
close.pdf
}
\caption
{$
x
(
0
)
=
0
.
5
$
,
$
y
(
0
)
=
1
.
0
$}
\end{figure}
\begin{figure}
[H]
\includegraphics
[scale=.5]
{
mod
_
pp
_
far.pdf
}
\caption
{$
x
(
0
)
=
100
$
,
$
y
(
0
)
=
200
$}
\end{figure}
We zien dat in beide gevallen de grafiek niet boven de 100 uitkomt (namelijk
omdat
$
y
_
m
=
100
$
, dit is de maximumwaarde). De tweede grafiek vertoont na
verloop van tijd min of meer hetzelfde gedrag als de eerste, alleen wordt in het
eerste gedeelte de stabiele positie ``opgezocht'' waarna naar dezelfde
evenwichtsstand wordt bewogen.
Hieruit concluderen we dat de startwaarden waarschijnlijk weinig uitmaken, omdat
na verloop van de tijd de grafiek toch wel een evenwichtsstand bereikt.
\subsection
{
PID controller
}
\subsection
{
PID controller
}
De constante P is de mate waarin de afstand tot de doelpositie (
$
s
$
) meetelt
voor de snelheid van de beweging. Als
$
s
(
0
)
$
positief gekozen wordt moet P
negatief zijn (bijv.
$
3
>
0
$
, als
$
s
(
0
)
=
3
$
, er moet naar
$
s
=
0
$
worden
bewogen dus een negatieve beweging), en andersom.
D is de mate waarin de bewegingssnelheid wordt beperkt, men wil waarschijnlijk niet dat de arm
een bepaalde snelheid overschrijdt. Omdat D een beperkende factor is, is deze
ook negatief.
$
d
$
is de delay voor het bewegen voor de arm, we hebben voor verschillende waarden
hiervan de grafiek geplot. We hebben hierbij gekozen voor
$
P
=
-
3
$
,
$
D
=
-
1
$
,
$
a
=
0
.
1
$
en
$
m
=
10
$
als constanten.
\begin{figure}
[H]
\includegraphics
[scale=.5]
{
pid
_
big.pdf
}
\caption
{$
d
=
1
.
0
$}
\end{figure}
\begin{figure}
[H]
\includegraphics
[scale=.5]
{
pid
_
medium.pdf
}
\caption
{$
d
=
0
.
5
$}
\end{figure}
\begin{figure}
[H]
\includegraphics
[scale=.5]
{
pid
_
small.pdf
}
\caption
{$
d
=
0
.
1
$}
\end{figure}
We zien dat hoe kleiner
$
d
$
, hoe vlugger de grafiek een evenwichtsstand bereikt.
Dit is logisch, want de arm reageert sneller als de delay kleiner is.
\subsection
{
Gilpin's Model
}
\subsection
{
Gilpin's Model
}
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment