Ik moet een functie schrijven voor op de universiteit.
Mijn scripts en functies zijn klaar, leveren geen foutmeldingen meer op, maar toch klopt het van geen kanten.
Al mijn waardes worden herleid naar nul
We moeten aan de hand van ons nummer van de unif de fictieve beweging volgen van bacteriën.
De bacterie verspreiden zich als volgt:
Als het aantal bacteriën boven de targetgrens liggen gebeurt er niets, als het kleiner of gelijk is dan gaat de volgende stappen op.
Indien het een hoek is van de matrix, dan wordt het aantal bacteriën door 2 gedeeld en verspreid over de 2 aanliggende velden, als het aanwezige getal niet te delen is door 2 dan blijft de rest van de deling achter.
De methode voor de randen en het midden van de matrix is hetzelfde buiten dat er dan 3 of 4 buren zijn.
Ik vermoed dat mijn fout in de functie ziektekiemen zit.
Maar ik post toch maar even alles voor de zekerheid
Alvast bedankt
Het inleidend script
Functie om het aantal buren te bepalen
Functie die bepaald wat er met de bacteriën gebeurd
Functie die matrix vernieuwt (Hier zit de fout waarschijnlijk)
Mijn scripts en functies zijn klaar, leveren geen foutmeldingen meer op, maar toch klopt het van geen kanten.
Al mijn waardes worden herleid naar nul
We moeten aan de hand van ons nummer van de unif de fictieve beweging volgen van bacteriën.
De bacterie verspreiden zich als volgt:
Als het aantal bacteriën boven de targetgrens liggen gebeurt er niets, als het kleiner of gelijk is dan gaat de volgende stappen op.
Indien het een hoek is van de matrix, dan wordt het aantal bacteriën door 2 gedeeld en verspreid over de 2 aanliggende velden, als het aanwezige getal niet te delen is door 2 dan blijft de rest van de deling achter.
De methode voor de randen en het midden van de matrix is hetzelfde buiten dat er dan 3 of 4 buren zijn.
Ik vermoed dat mijn fout in de functie ziektekiemen zit.
Maar ik post toch maar even alles voor de zekerheid
Alvast bedankt
Het inleidend script
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
| clear all
Mycode = [ 0 2 5 5 7 3 1];
Myvec=Mycode(4:7);
Mylimit=max(Mycode)*sum(Mycode);
N=zeros(21);
N(1,11)=Myvec(1);
N(21,11)=Myvec(2);
N(11,1)=Myvec(3);
N(11,21)=Myvec(4);
target=Mylimit;
% Bepaal gemiddeld aantal ziektekiemen en maxima
[n,m] = size(N);
Maxima = zeros(1,31);
Gemiddelde = zeros(1,31);
t = 0:30;
% Bereken situatie na 30 dagen
for p = 1:30
M = ziektekiemen ( N, target);
Maxima(1,p) = max(max(N(1:n)));
Gemiddelde(1,p) = (sum(sum(N(1:n,:)))) /(n*m);
M = N + M;
end
Gemiddelde(1,31) = (sum(sum(N(1:n,:)))) /(n*m);
Maxima(1,31) = max(max(N(1:n)));
save matrix.dat M -ascii
% Plot 'Gemiddelde' en 'Maxima' in functie van 'Tijd'
clf
plot(t, Gemiddelde, 'or-');
hold on;
plot(t, Maxima, '*b-');
grid on;
xlabel('Tijd (in dagen)');
ylabel('Aantal ziektekiemen');
legend('Gemiddelde','Maximum');
title('Donaat & 1'); |
Functie om het aantal buren te bepalen
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| function a=aantal_buren(n,m,r,k)
if r>n ||k>m
disp 'Kan aantal buren niet berekenen, dimensies kloppen niet'
a=0;
else
if r==1 %voor de eerste rij geldt :
if k>1 && k<m % als het het eerste element niet is, en het is ook niet het laatste dan zijn er 3 buren
a=3;
else
a=2; %het is ofwel het eerste element of het laatste van de eerste rij
end
elseif r==n %voor de laatste rij geldt:
if k>1&&k<m %als het het eerste element niet is, en het is ook niet het laatste dan zijn er 3 buren
a=3;
else %het is het eerste of het laatste element
a=2;
end
else % voor alle rijen verschillend van de eerste of de laatste
if m==k || n==r % het zit in de eerste of de laatste kolom
a=3;
else %het zit in het midden van de matrix
a=4;
end
end
end |
Functie die bepaald wat er met de bacteriën gebeurd
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| function [weg,blijf]=reproductie(z,a,target)
if z<=target % Aantal kiemen kleiner dan de max dus
z=2*z; % Verdubbelen kiemen
t=mod(z,a); % Onderzoeken of z deelbaar is door a
if t==0 % Het is deelbaar dus:
weg=z/a; % Het aantal kiemen dat weggaat is gelijk aan het # kiemen / # buurvelden
blijf=0; % Er blijven geen kiemen achter
else % Z is niet deelbaar door a
z=z-t; % Er wordt een z berekend die wel deelbaar is door a
blijf=t; % Dat getal t is gelijk aan het aantal blijvers
weg=z/a; % Het deelbare getal / #buurvelden geet het aantal vertrekkers weer
end
else % Er zijn al teveel kiemen. Alle kiemen blijven in dit veld
blijf=z;
weg=0;
end |
Functie die matrix vernieuwt (Hier zit de fout waarschijnlijk)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
| function M=ziektekiemen(N,target)
[n,m]=size(N);
M=zeros(n,m);
B=zeros(n,m);
for r=1:n
for k=1:m
if M(r,k) >0
z=M(r,k);
a=aantal_buren(n,m,r,k);
[weg,blijf]=reproductie(z,a,target);
B(r,k)=blijf;
%end
if a==2 % Het is een hoek
if r==1 && k==1 %linkerbovenhoek
M(r+1,k)=weg+M(r+1,k);
M(r,k+1)=weg+M(r,k+1);
elseif r==1 && k==m %rechterbovenhoek
M(r+1,k)=weg+M(r+1,k);
M(r,k-1)=weg+M(r,k-1);
elseif r==n && k==1 %linkerbenedenhoek
M(r-1,k)=weg+M(r-1,k);
M(r,k+1)=weg+M(r,k+1);
else %rechterbenedenhoek
M(r-1,k)=weg+M(r-1,k);
M(r,k-1)=weg+M(r,k-1);
end
elseif a==3 % Het is een rand, maar geen hoek
if r==1 % linkerrand
M(1,k-1)=weg+M(1,k-1);
M(1,k+11)=weg+M(1,k+1);
M(2,k)=weg+M(2,k);
elseif r==n % rechterrand
M(n,k-1)=weg+M(n,k-1);
M(n,k+1)=weg+M(n,k+1);
M(n-1,k)=weg+M(n-1,k);
elseif k==1 %bovenrand
M(r-1,1)=weg+M(r-1,1);
M(r+1,1)=weg+M(r+1,1);
M(r,2)=weg+M(r,2);
else % onderrand
M(r-1,m)=weg+M(r-1,m);
M(r+1,m)=weg+M(r+1,m);
M(r,m-1)=weg+M(r,m-1);
end
else % binnenkant matrix
M(r,k-1)=weg+M(r,k-1);
M(r,k+1)=weg+M(r,k11);
M(r-1,k)=weg+M(r-1,k);
M(r+1,k)=weg+M(r+1,k);
end
end
end
end
M=M+B; %achterblijvers en verplaatsingen samen tellen |