Blatt 7 - Bezier2

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Blatt 7 - Bezier2
Die Aufgabe war insgesamt eigentlich kein Problem, aber bei bezier2 klappt genau ein Test der bezier_test.py nicht…
Der Aufruf bezier2
(array([[3., 2.],
[2., 5.],
[6., 6.],
[8., 1.]]), 2) liefert das Ergebnis
array([[3. , 2. ],
[2.75 , 2.75 ],
[2.8125 , 3.375 ],
[3.078125 , 3.8125 ],
[3.46875 , 4.09375 ],
[3.9453125 , 4.234375 ],
[4.48046875, 4.21875 ],
[5.015625 , 4.203125 ],
[5.609375 , 4.03125 ],
[6.234375 , 3.6875 ],
[6.875 , 3.125 ],
[7.5 , 2.25 ],
[8. , 1. ]]), richtig wäre aber
array([[3. , 2. ],
[2.75 , 2.75 ],
[2.8125 , 3.375 ],
[3.078125, 3.8125 ],
[3.34375 , 4.25 ],
[3.8125 , 4.5 ],
[4.375 , 4.5 ],
[4.9375 , 4.5 ],
[5.59375 , 4.25 ],
[6.234375, 3.6875 ],
[6.875 , 3.125 ],
[7.5 , 2.25 ],
[8. , 1. ]]).

Kann mir jemand sagen, ob ich tatsächlich einen Fehler drin habe (obwohl alle anderen Tests problemlos durchlaufen und ich auch beim Selbstrechnen auf meine Zahlen gekommen bin) oder ob die Testmethode falsch ist? Danke!


Hing gerade an genau dem gleichen Problem.
Mein Denkfehler war, die Rekursion mit dem schon wieder zusammengefügten Polynom anstatt mit den beiden gesplitteten Teilen aufzurufen, was ja irgendwie nicht wirklich Sinn macht. Nach ein bisschen umbasteln laufen die Tests jetzt alle durch bei mir, die sollten also stimmen.


wenn ich das bei meiner lösung austausche, schlagen 5/6 testcases fehl - nicht nur einer :-p

nichtsIstTrivial: ohne konkrete frage kann ich dir da wohl nicht helfen. da du die funktion aus teilaufgabe e) verwenden sollst, kann es auch sein, dass du da nicht das richtige machst. wie schon häufiger im forum erwähnt bietet es sich an, deine funktionen in der [m]main()[/m] funktion zu testen und zwischenschritte mittels [m]print()[/m] auszugeben.


Einfach nur austauschen reicht natürlich nicht, danach sind ja Arraygrößen und Schleifengrenzen alle falsch.
Als ich den gleichen Fehler wie @nichtsIstTrivial hatte, habe ich immer P in zwei feinere Teile gesplitten, wieder gemerged, damit dann die Rekursion aufgerufen und also im nächsten Durchlauf wieder gesplittet, gemerged, und so weiter. Dazu brauch ich ja nicht mal ne Rekursion, das ist nur eine for-Schleife mir Länge depth. (Wobei es mich jetzt interessieren würde ob das nicht auch gegen die Bezier-Kurve konvergiert, nur halt mit anderen Werten). Was ich jetzt mache ist, P zu splitten, dann für beide Teile jeweils die Rekursion aufzurufen und dann das was zurückkommt zu mergen und zurückzugeben. Vielleicht liege ich ja wirklich falsch und es funktionieren nur zufällig alle Tests bei mir, aber es kommt mir schon sehr viel logischer vor so rum und ich wüsste auch wirklich nicht wie mans sonst noch angehen sollte.


Wow vielen Dank sirozan, jetzt klappts bei mir auch!


Wie macht man es am Besten, dass keine doppelten Werte auftauchen?


was meinst du mit am besten? am performantesten?


Ich meine eher am einfachsten :smiley:


  1. überleg dir selber was (+ trial-and-error)
  2. suchmaschine deiner wahl
  3. frage deine kommilitonen um rat
  4. brainstorming in der rechnerübung mit einem tutor

ich kann dir hier nicht im forum einfach so eine lösung zusammenstellen.
irgendwo musst du deine übung schon selbst lösen… :wink:

bei konkreteren fragen kann ich versuchen dir zu helfen.


Ich wollte keine Lösung dafür, nur vielleicht einen Tipp. :slight_smile:
Aber hat sich jetzt sowieso erledigt, hab’s auch so hingekriegt.

Rekursion
Wie kriege ich es hin, dass ich am Ende ein Array ausgeben kann? Dazu muss ich ja ein Array anlegen, macht in einer rekusiven Methode aber doch ech wenig Sinn, weil dann in jedem Durchlauf ein neues Array angelegt wird, was mir den ganzen Prozess zerschießt oder? Wie kann man das denn anders lösen und trotzdem am Ende ein Array ausgeben? :frowning:


nein, wieso?
bei endlich vielen rekursionsschritten in dieser größenordnung ist das nicht wirklich ressourcen-aufwendig.
falls du eine out-of-memory-exception oder etwas ähnliches bekommst, dann wird deine rekursion evtl nicht bei der übergebenen tiefe ([m]depth[/m] argument) beendet…


Nein, das meinte ich nicht, das Problem ist, dass doch in jedem Durchlauf wieder ein neues Array angelegt wird und dort etwas gespeichert wird, wodurch man dann genau so viele Arrays hat mit einem Eintrag wie Rekursionsschritte oder? Wenn ich das Array nicht übergeben kann, kann ich ja auch nicht auf dem Originalarray arbeiten. Wie stelle ich es an, dass ich auf dem Originalarray arbeite?
EDIT:
Bzw der Rekursionsschritt ist ja nicht der letzte Schritt, so wie ich es verstehe, denn nach dem Splitten, was rekursiv läuft, muss man die Arrays oder Tupel zusammen führen, das ist der letzte Schritt, oder hab ich da einen Verständnisfehler drin?


rekursion soll innerhalb der aufgabe so realisiert werden, dass du dein ursprüngliches numpy array (nx2 matrix), welches ein polygon - eine liste aus n punkten - darstellt, mithilfe von [m]split_curve()[/m] solange [m]depth[/m]-oft rekursiv unterteilst und wieder zusammenfügst. du arbeitest quasi schon beim ersten aufruf nicht mehr auf deinem “original”-array. für das zusammenfügen wirst du wohl ein neues array pro rekursiven aufruf erstellen, ja. wenn dus dir bildlich vorstellen möchtest, sieht der aufruf von [m]bezier2()[/m] wie ein baum aus.


Ja, aber wenn ich jeden Durchlauf ein neues Array per zeros anlege, dann ist es ja recht logisch, dass am Ende ein Array mit fast nur 0 als Ergebnis rauskommt. Wie behebe ich das?


warum ist das logisch? wenn deine nullen im array bleiben, befüllst du es wohl nicht voll.
erstellst du möglicherweise dein array zu groß?