Optimierung einer Rechnung < Matlab < Mathe-Software < Mathe < Vorhilfe
|
Hallo zusammen!
Ich habe mich heute mal hobbymäßig an ein Programm gemacht, mit welchem ich gewisse Wahrscheinlichkeiten berechnen möchte...
Es geht darum, zur Berechnung einer Laplace-Wahrscheinlichkeit die Anzahl der günstigen Fälle auszugeben:
Zur Verfügung stehen bis zu
- 3 4-seitige
- 2 6-seitige
- 2 8-seitige
- 1 10-seitiger
- 1 12-seitiger
- 1 20-seitiger Würfel
Bei meinem Programm kann man zunächst eingeben, für welche Zahl die Wahrscheinlichkeit berechnet werden soll (größte Zahl wird etwa 50 sein) und anschließend, wie viele Würfel zur Verfügung stehen.
So für sich allein, läuft es bereits korrekt und halbwegs flott, nur soll es später in ein größeres Programm implementiert werden, welches alle möglichen Würfelkombinationen durchgeht, wodurch die Ausführung sehr lange dauert; vor allem, wenn viele Würfel verwendet werden.
Es geht mir jetzt also darum, Vorschläge oder Korrekturen zu erhalten, die Anzahl der günstigen Fälle schneller zu berechnen.
Meinen Kommentierten Quelltext füge ich mal mit ein. Bin leider noch kein Profi in Matlab^^
zum Download (oder s.u.):
m-file: http://www.fileuploadx.de/251124
txt-file: http://www.fileuploadx.de/31362
Besten Dank schonmal im Voraus und einen schönen Abend allen Lesern ;)
PS: Da es bislang nur ein Teil eines größeren Programms ist und das Endergebnis zu einer komplizierteren Aufgabe gehört, passen die Rechnungen nicht zu einer Laplace-Wahrscheinlichkeit. Habe das jetzt nur zur Vereinfachung gesagt - ist aber für mein Problem auch vollkommen nebensächlich.
% günstige und mögliche
% final
function gunstige
% Zahlabfrage
z=input('Gebe die Zahl ein: ');
% Eingabe der zur Verfügung stehenden Würfel
Aw4=input('4: ');
Aw6=input('6: ');
Aw8=input('8: ');
Aw10=input('10: ');
Aw12=input('12: ');
Aw20=input('20: ');
% Mögliche Fälle
% Übersetzen der Würfelanzahl in einzelne Würfel
if Aw4==0
w41=1;
w42=1;
w43=1;
elseif Aw4==1;
w41=4;
w42=1;
w43=1;
elseif Aw4==2;
w41=4;
w42=4;
w43=1;
elseif Aw4==3;
w41=4;
w42=4;
w43=4;
end
if Aw6==0
w61=1;
w62=1;
elseif Aw6==1;
w61=6;
w62=1;
elseif Aw6==2;
w61=6;
w62=6;
end
if Aw8==0
w81=1;
w82=1;
elseif Aw8==1;
w81=8;
w82=1;
elseif Aw8==2;
w81=8;
w82=8;
end
if Aw10==0
w101=1;
else
w101=10;
end
if Aw12==0
w121=1;
else
w121=12;
end
if Aw20==0
w201=1;
else
w201=20;
end
% Anzahl der möglichen Fälle
mogliche=w41*w42*w43*w61*w62*w81*w82*w101*w121*w201;
% Günstige Fälle
% Für die Schleifen benötigte Variablen einführen
a=0;
b=0;
c=0;
d=0;
e=0;
f=0;
g=0;
h=0;
i=0;
j=0;
gunstige=0;
% Schleife für den ersten 4seitigen Würfel, in jeder Schleife erhöht sich
% die Augenzahl um 1
while a<3
% Überprüfung, ob der erste 4seitige Würfel überhaupt verwendet wird
if Aw4==0
% falls nicht Verwendet, wird hierdurch die while-Schleife nicht weiter
% ausgeführt
a=3;
% Die Augenzahl dieses nicht vorhandenen Würfels wird auf 0 gesetzt
aa=0;
else
% falls der Würfel verwendet wird, wird hier in jeder Schleife die
% Augenzahl um 1 erhöht
a=a+1;
% die Augenzahl wird festgesetzt
aa=a;
end
% Analog zum ersten vierseitigen Würfel, wird hier der zweite
% vierseitige Würfel behandelt
while b<3
if Aw4<=1
b=3;
bb=0;
else
b=b+1;
bb=b;
end
% etc
while c<3
if Aw4<=2
c=3;
cc=0;
else
c=c+1;
cc=c;
end
while d<5
if Aw6==0
d=5;
dd=0;
else
d=d+1;
dd=d;
end
while e<5
if Aw6<=1
e=5;
ee=0;
else
e=e+1;
ee=e;
end
while f<7
if Aw8==0
f=7;
ff=0;
else
f=f+1;
ff=f;
end
while g<7
if Aw8<=1
g=7;
gg=0;
else
g=g+1;
gg=g;
end
while h<9
if Aw10==0
h=9;
hh=0;
else
h=h+1;
hh=h;
end
while i<11
if Aw12==0
i=11;
ii=0;
else
i=i+1;
ii=i;
end
% der letzte Würfel, der Zwanzigseitige
while j<19
if Aw20==0
j=19;
jj=0;
else
j=j+1;
jj=j;
end
% Summation der Augenzahl für die
% aktuellen Würfelaugenzahlen
test=aa+bb+cc+dd+ee+ff+gg+hh+ii+jj;
% Überprüfe, ob es sich um die
% passende Augenzahl handet
if test==z
% falls ja, wird hiermit
% gezählt, auf wie viele Weisen
% die Zahl kombiniert werden
% kann
gunstige=gunstige+1;
end
end
% Auf Null setzten der
% Schleifenvariable für den
% Zwanzigseitigen Würfel für die
% weiteren Kombinationen der vorherigen
% Würfel
j=0;
end
i=0;
end
h=0;
end
g=0;
end
f=0;
end
e=0;
end
d=0;
end
c=0;
end
b=0;
end
% Ausgabe der Wahrscheinlichkeit
P=gunstige/mogliche
end
|
|
|
|
Hallo Tobias,
ehrlich gesagt habe ich deinen code jetzt nicht durchgearbeitet und verstehe auch nicht 100%-ig, was das programm genau leisten soll. Ich kann dir also nur ein paar allgemeine tips geben, mit denen du vielleicht etwas anfangen kannst:
1.) kann man den dahinterstehenden mathematischen algorithmus nicht vielleicht optimieren? Muessen wirklich saemtliche faelle durchge-x-t werden?
2.) Wie du vermutlich weisst, ist MATLAB besonders dann stark, wenn es um rechnen mit matrizen geht. Zig-fach verschachtelte schleifen und bedingungen sollte man, falls irgend moeglich, vermeiden. Nach meinem eindruck zu urteilen, koennte das bei deinem konkreten problem allerdings schwierig sein.
3.) Falls Du also diese ganzen verzweigungen wirklich brauchst und einen wirklich schnellen code produzieren willst, geht eigentlich kein weg an C bzw. C++ vorbei. Moechtest du deine routine in ein groesseres projekt in MATLAB einbinden, so koenntest Du sie als MEX-file in C kompilieren und dann als MATLAB funktion einbinden. Das geht (zumindest fuer uebersichtliche routinen) sehr gut und elegant.
gruss
matthias
|
|
|
|