|
Hallo Forum,
ich habe ein mathematisches Problem, das eng mit der Informatik zusammenhängt. Ich möchte eine Perlin Noise-Funktion aufstellen. Bei dieser geht es darum, eine Funktion zu finden, die durch zwei Punkte auf der X-Achse mit zwei vorgegebenen Steigungen geht. Der erste Punkt liegt im Ursprung, der andere im Abstand auf der positiven X-Achse. Für beide Punkte sind die Steigungen und gegeben. Ich habe bereits ein Polynom dritten Grades gefunden, das genau zu diesen Anforderungen passt. In dem Programm, dass dieses Konzept verwendet, sollen jetzt aber die Steigungen zufällig festgelegt werden, sodass ein zufälliges Terrain zwischen den beiden Punkten entsteht. Für dieses Terrain möchte ich aber als Input nicht die Steigungen der Punkte, sondern die maximale Amplitude der Funktion festlegen können. Beispielsweise weiß ich, dass der Ausschlag des Polynoms zwischen den beiden Punkten maximal betragen darf. Wie komme ich dann darauf, welchen "Definitionsbereich" die beiden Steigungen haben, also zwischen welchem Minimum und Maximum ich sie wählen darf?
Noch eine Anmerkung: Die Steigungen müssen prinzipiell komplett unabhängig festgelegt werden. Man darf also nicht die eine Steigung komplett zufällig festlegen und dann die andere eben so, dass die Funktion die Maximal-Amplitude einhält. Es muss ein von und abhängiger Wert gefunden werden, der den maximalen Betrag der beiden Steigungen festlegt.
Sorry für so viel Text und danke für jede Hilfe! :-)
Für alle, die mir helfen möchten (automatisch von OnlineMathe generiert): "Ich möchte die Lösung in Zusammenarbeit mit anderen erstellen." |
|
|
Es muss ein von und amax abhängiger Wert gefunden werden, der den maximalen Betrag der beiden Steigungen festlegt.
Was soll denn amax genau sein? Wirklich der höchste Punkt der Kubik zwischen den beiden gegebenen? Oder ev. auch der tiefste? Und was macht dich so sicher, dass es bloß einen Maximalwert für jede der beiden Anstiege gibt, der die Grenze bildet? Da gibts vl mehrere Bereiche, etc. Du musst wohl definieren, was genau du als "Amplitude" bezeichnen möchtest. Soll das wirklich vom gewählten Koordinatensystem abhängig sein?
Ansonsten kannst du ja mal mit allgemeinem und und die Kubik aufstellen, ableiten und die Extremwerte ermitteln. Deren y-Koordinaten werden dann von und abhängig sein. Möglicherweise siehts du dann schon Begrenzungen für deine . Aufpassen musst du dabei nur, ob der Extremwert auch wirklich zwischen deinen beiden Punkten liegt, seine x-Koordinate sich also in befindet. Denn ansonsten ist er für deine Zwecke ja irrelevant.
Als kleine Starthilfe im Anhang die beiden Extremstellen und deren Funktionswerte. Beides in Abhängigkeit von und . Wobei ja vermutlich egal ist, das ist nur ein Skalierungsfaktor. Viel Spaß damit ;-)
|
|
Danke für die Antwort!
Die Amplitude habe ich mir als das Maximum des Ausschlags der Funktion zwischen den beiden Punkten vorgestellt. Also wenn beide Extrema darin liegen, deren betragsmäßig größte Y-Koordinate.
Ja das mit dem ableiten und mit 0 gleichsetzen hatte ich so auch schon gemacht, aber leider kann ich aus den Funktionswerten, die du ja auch geschrieben hast, praktisch gar nichts anfangen... :-D) Ich wüsste nicht, wie ich hieraus Einschränkungen für meine Steigungen ablesen sollte.
Ich war auf jeden Fall leicht stutzig, als ich bemerkt habe, dass die beiden Steigungen wegen unterschiedlichen Vorfaktoren unterschiedlichen Einfluss auf die Amplitude zu haben scheinen. Meine Vermutung war, dass das daran liegt, dass der Definitionsbereich nicht symmetrisch zum Ursprung ist (Abstände der beiden Punkte zum Ursprung sind verschieden). Habe deswegen die Funktion um nach links verschoben; danach gibt es keine asymmetrischen Vorfaktoren mehr... Aber aus dem Term für die Amplitude bin ich auch nicht schlauer geworden als aus deinem hier geposteten... :-D)
|
|
Die Amplitude habe ich mir als das Maximum der Funktion zwischen den beiden Punkten vorgestellt. Da du das KS ja den beiden Punkten angepasst hast, macht das vermutlich auch Sinn. Problematisch wie schon geschrieben die Unterscheidung, ob ein Extremwert zwischen den beiden Punkten liegt, oder nicht. Bei deiner Aufstellung gibts ja immer zwei Extremwerte, von denen mindestens einer auch zwischen den beiden Punkten liegt.
Ich wüsste nicht, wie ich hieraus Einschränkungen für meine Steigungen ablesen sollte. Ich auch nicht. Wollte dir das Ergebnis meines Programms aber nicht vorenthalten ;-)
Ich war auf jeden Fall leicht stutzig, als ich bemerkt habe, dass die beiden Steigungen wegen unterschiedlichen Vorfaktoren unterschiedlichen Einfluss auf die Amplitude zu haben scheinen. Das glaube ich nicht. Die Aufgabe müsste symmetrisch bzgl und sein.
Meine Vermutung war, dass das daran liegt, dass der Definitionsbereich nicht symmetrisch zum Ursprung ist ( Nein, mit der Lage der Punkte bzgl. des Ursprungs kann das nichts zu tun haben. Wenn du die Punkte gleichzeitig nach rechts oder links schiebst, ändert sich ja nichts an der Form der kubischen Parabel.
Habe deswegen die Funktion um nach links verschoben; danach gibt es keine asymmetrischen Vorfaktoren mehr... Das mag rechentechnisch vielleicht Vorteile haben, aber am eigentlichen Ergebnis sollte das nichts ändern.
Ich bin mir nicht sicher, obs für deine Aufgabe eine Lösung geben wird. Natürlich gibts für jedes einen Bereich für sodass das Maximum nicht größer wird als ein vorgegebener Wert. Aber Grenzen, die unabhängig voneinander sind ? Naja, nehmen wir den Fall signum(m_1) signum(m_2). Dann liegt ja nur ein Extremwert zwischen den beiden Punkten. Jetzt könntest du den symmetrischen Fall betrachten und herausfinden, für welchen Anstiegswert dieses Extremum genau den a_max liefert. Dann hast du mit und Grenzen wie gewünscht gefunden. Allerdings ist jetzt insofern doch wieder von abhängig, weil ja die Vorzeichen der beiden Anstiege verschieden sein müssen. für und solltest du aber hinkommen. Ähnliches könnte man sich vl für vorzeichengleiche Anstiege überlegen.
Kannst du bezüglich der Anstiege und irgendwelche Aussagen machen, oder sind die grundsätzlich beide beliebig in ganz zu wählen?
|
|
Noch mal dankesehr für die Hilfe! :-)
> Ich auch nicht. Wollte dir das Ergebnis meines Programms aber nicht vorenthalten ;-) :'D
Hm ja die Gedanken kann ich nachvollziehen. Für das ganze spätere Programm ist dieses Problem aber eigentlich noch ein bisschen komplexer: Genau genommen werden n + 1 Punkte mit Abstand s auf der X-Achse verteilt und jeder bekommt eine Steigung zugewiesen. Jetzt sucht man in jedem Intervall zwischen zwei benachbarten Punkten einen passenden Funktionsterm. Das macht es deswegen schwieriger, weil die maximale Amplitude eigentlich für ALLE Funktionen gilt. Also a_max bezeichnet jetzt nicht mehr den Ausschlag einer einzigen Funktion, sondern den maximalen Ausschlag aller n Teilfunktionen. Dabei muss man zusätzlich leider davon ausgehen, dass die beiden Steigungen an den äußersten Punkten vorgegeben, also nicht beliebig wählbar sind. Wenn ich zum Beispiel im Voraus allen "inneren" Punkten ein zufälliges Vorzeichen für die Steigung zuweise, kann ich wie von dir beschrieben, z.B. für das erste und letzte Intervall jeweils die maximale Steigung und dann einen zufälligen Funktionsterm herleiten. So kann man immer weitergehen, bis in der Mitte nur noch ein bzw. zwei Intervalle übrig bleiben. Und die müssen jetzt eigentlich genau zusammen- und zur maximalen Amplitude passen, aber das lässt sich dann wohl nicht mehr gewährleisten...
Vielleicht sollte man sich eher nach einem anderen Funktionsterm umschauen. Vielleicht wäre ja ein Polynom vierten Grades praktikabler. Oder eine ganz andere Funktion. Grundsätzlich geht es ja einfach darum, eine stetige zufällige Funktion zu finden, die durch diese n + 1 gleich weit entfernten Punkte auf der X-Achse geht. Und Sinus und Cosinus scheiden praktisch aus, weil sie am Computer zu viel Leistung verbrauchen... :-D)
|
|
Na, wenns nur stetig sein soll, dann kannst du ja einfach die Spitzen abschneiden. "Wenn y-Wert>max, dann y-Wert=max". Das Problem scheint mir da aber eher die "Zufälligkeit" zu sein. Warum sollten Sinus und Kosinus zu rechenintensiv sein? Werd doch auch nur mit Potenzreihen, also auch nur Polynomen, erledigt und außerdem könnte man mit flotten vorberechneten lookup tables arbeiten.
Wenn die Steigung im ersten Punkt vorgegeben ist, dann muss aber zwangsläufig die Steigung im zweiten Punkt von dieser abhängig sein. Genau das, was du aber vermeiden wolltest.
|
|
Hups wie peinlich, ich meinte natürlich differenzierbar :-D)
Hm ja so ne Lookup Table wäre wahrscheinlich einigermaßen effizient... Würde ich aber trotzdem eher vermeiden... Keine Ahnung... :'D
> Wenn die Steigung im ersten Punkt vorgegeben ist, dann muss aber zwangsläufig die Steigung im zweiten Punkt von dieser abhängig sein. Genau das, was du aber vermeiden wolltest.
Ja da hast du Recht. Das ist mir auch erst bei meinem letzten Post eingefallen... Eigentlich sollten die inneren Steigungen doch komplett unabhängig von den beiden äußeren sein. Mal ein Beispiel: Man hat nur zwei Teilintervalle und legt jetzt in der Mitte ein zufälliges Vorzeichen für die Steigung fest. Jetzt lässt sich für das linke Teilintervall ein erlaubter Bereich für die Steigung errechnen und für das rechte auch. Der insgesamt erlaubte Bereich ist dann eben die Schnittmenge von den beiden Teilbereichen. Aber wenn man jetzt mehr Teilintervalle hat, wüsste ich nicht mehr, wie man mit demselben Konzept vorgehen könnte... Und außerdem ist ja dann eben wirklich wieder eine Abhängigkeit da...
Vielleicht sollte man es ganz anders machen: Vielleicht sollte man einen weiteren Funktionsparameter einbauen. Dann werden zuerst komplett unabhängig die Steigungen festgelegt. Und dann wird der zusätzliche Parameter zufällig so gewählt, dass die maximale Amplitude passt.
|
|
Vielleicht wäre folgende Vorgangsweise praktikabel.
erstes linkes Intervall: vorgegeben ist . Bestimme den Bereich, in dem sich bewegen darf, sagen wir
letztes Intervall analog, wir bestimmen für den erlaubten Bereich .
Der Durchschnitt dieser beiden Intervalle sei nun . Das ist aber noch nicht die Lösung, denn da bekämen wir Probleme mit zu großen Amplituden, wenn die vorgegebenen Anstiege sehr klein sind. Also müssen wir diese Durchschnittsintervall weiter beschränken. Seien die gegebenen Steigungen und .
Jetzt gehts um Fallunterscheidungen. Ist dann müssen wir die obere Intervallsgrenze mit berechnen. Ist dann ist die untere Intervallgrenze .
Das sollte, glaube ich mal auf die Schnelle, das gewünschte leisten, auch wenn bei ungünstigen Steigungsvorgaben das sich ergebende Intervall sehr klein ausfallen kann.
|
|
Hm sorry das habe ich jetzt nicht ganz verstanden...
> Der Durchschnitt dieser beiden Intervalle sei nun [-e;f]. Was ist hier mit dem Durchschnitt gemeint? Die Schnittmenge von [-a; b] und [-c; d]?
> denn da bekämen wir Probleme mit zu großen Amplituden, wenn die vorgegebenen Anstiege sehr klein sind Was meinst du damit...?
|
|
Nehmen wir, für das erste Intervall ergibt sich, dass aus zu wählen ist, damit der Betrag des Maximums zwischen den ersten beiden Punkten den vorgegebenen Höchstwert nicht überschreitet. Das habe ich mit bezeichnet. mit deshalb, um deutlich zu machen, dass es sich idR um einen negativen Wert handeln wird.
Bei den letzten beiden Punkten könnte sich einstellen, dass aus wählbar ist.
Damit wäre der Durchschnitt das Intervall
Wenn nun der vorgegeben Anstieg ganz links ist und der ganz rechts so sollte jeder der mittleren Anstiege im Bereich wählbar sein. Ist noch nicht ganz durchgedacht - möglicherweise muss man die Vorzeichen der Anstiege noch detaillierter unterscheiden.
|
|
So, ich habe jetzt eine ganz andere Möglichkeit gefunden.
Bei der Anwendung ging es ja darum zufälliges, Terrain zu generieren. Und ich habe das jetzt so gelöst: Anfangs existiert ein einziges Polynom zwischen zwei Punkten mit zwei Steigungen. Jetzt wird dieses Intervall in n kleinere Intervalle zerlegt. Für jeden der Grenzpunkte werden Höhe und Steigung des Polynoms bestimmt. Jetzt können auf diese ermittelten Werte je nach gewünschtem Terrain zusätzliche Zahlen addiert werden. Die entstehenden Punkte bilden die neuen Aufhängungspunke. Es wird also das alte Polynom verworfen und n neue Polynome zwischen den Punkten gebildet. So hat man das Terrain also von einem groben Basis-Profil "verfeinert". Das kann man solange wiederholen, bis man das geeignete Terrain gefunden hat.
Danke für die Hilfe! :-D)
|