optimaler sanft beschleunigender Aufzug
-
inspiriert von der Frage im Thread http://www.c-plusplus.net/forum/viewtopic.php?t=58799 ...
Es gelte einen Lastenaufzug möglichst schnell auf einer Länge x0 von Stock A nach B zu befördern, aus der Ruhe, in die Ruhe, mit der Bedingung dass die Beschleunigung a(t)=d2x/dt2 stetig ist (das sind dann auch x(t) und dx/dt) und einen Maximalwert a_max nicht überschreitet.
es soll a=0 sein am Anfange und Ende der Strecke. (Ruhe, kein Ruck)gesucht ist die Funktion x(t) (Weg-Zeit-Diagramm), für die die Zeit T=Integral[0,x0](t(x)dx) minimal ist.
Also ein Problem der Variationsrechnung.
Traut sich da jemand ran? Bei mir liegt das schon ne Weile zurück.
-
Es soll natürlich der *Betrag* von a nicht a_max überschreiten. Die Leute sollen ja auch nicht beim abbremsen plattgedrückt werden.
a(t) wird wohl punktsymmetrisch zu T/2 sein.
-
a stetig ist irgendwie eine sehr seltsame Bedingung. Man könnte beispielsweise die Sigmoid-Funktion so extrem skalieren, dass sie von einem Sprung praktisch nicht zu unterscheiden ist, trotzdem ist sie stetig.
-
Hmm, ja. Wir sollten also auch noch |d3x/dt3| <= b_max fordern?
Na gut, wenn's jemand hinkriegt...
-
In Darkbasic habe ich das mal so gemacht:
If Upkey()=1 then a=timer()//nimm so etwas wie getticcount und fütter damit eine Variable : boost=1 //mach stattdessen eine integer Variable t=(timer()-a) //erstelle eine Variable in der du einen Neuen Timer einbringst, //der -a gerechnet wird If t < 3000 then speed#=speed#+0.3 //Wenn t <3000 also 3 Sekunden lang gedrückt dann mache das dass auto schneller wird. If t > 3000 and boost=1 then speed#=speed#+1 move object 1, speed#
Mathematisch gesehen:
Ein Timer der bei dem drücken der Taste erstellt wird, wird gegen einen allgemein laufenden Timer gerechnet, wenn der Timer einen bestimmten wert erreicht, beschleunigt das Auto. Mache Recht viele Stufen an Beschleunigung und
das ding beschleunigt ziemlich echt.Kann natürlich absoluter Schmarn sein, nochdazu überblicke ich den alten Code nicht mehr, da unkommentiert, aus einem anderen Forum geklaut und in DB.
cu max
-
Mathematisch gesehen:
Ein Timer der bei dem drücken der Taste erstellt wird, wird gegen einen allgemein laufenden Timer gerechnet, wenn der Timer einen bestimmten wert erreicht, beschleunigt das Auto. Mache Recht viele Stufen an Beschleunigung und
das ding beschleunigt ziemlich echt.Sehr mathematisch *g*
-
Bashar schrieb:
a stetig ist irgendwie eine sehr seltsame Bedingung.
Das macht's aber für die Variationsrechnung leichter...
-
Das mag sein, ich kenn mich mit Variationsrechnung nicht aus.
-
@Master_Max:
konkrete best effort-Implementierungen bitte im alten Thread posten!
hier geht's um die rein mathematisch *optimale* Lösung unter ganz bestimmten Bedingungen.@Marc++us:
genau
-
stetig ist wirklich eine reichlich merkwürdige Bedingung. Wenn ich das recht sehe willst Du halbwegs sanft anfahren, oder? Also wäre es doch sinnvoll, wenn die Beschleunigungsfunktion differenzierbar ist, oder?
MfG Jester
-
@Jester:
Ja. Ist ja in der neuesten Forderung jetzt mit drin.
Also nochmal explizit: a(t) soll differenzierbar sein und |da/dt|=|d3x/dt3|<=b_max überall.@all:
mal ein schnellüberlegter Ansatz:
intuitiv angenommen muss man für die optimale Lösung immer mit den maximal erlaubten Werten von d3x/dt3 arbeiten (Intuition falsch?).
d.h. d3x/dt3 ist im einfachsten Fall von der Form:
= +b_max für 0<t<T1
= -b_max für T1<t<T2
= +b_max für T2<t<T
(muss am Schluss wieder positiv sein, weil wir von einer negativen Beschleunigung auf 0 kommen müssen)
Damit reduziert sich das Problem auf die Bestimmung von T1 und T2.
-
vergesst meine Intuition.
irgendwie sind wir hier glaub ich eine Ableitung zu weit um Intuitionen anwenden zu können.
-
scrontch schrieb:
vergesst meine Intuition.
Warum? Voll Stoff und rechtzeitig wieder bremsen.
-
Sorry,
ich kann mir auch nicht erklären warum der code so läuft wie er da oben steht. Ich habe das vor zirka einem Jahr in dem davidmoore Darkbasic forum von jemanden bekommen. Das Auto was ich damit beschleunigen lies, beschleunigte aber eben so. Ich begebe mich mal auf die Suche nachdem alten Thread.Entschuldigung für die Verwirrung.
cu max
-
Bashar schrieb:
Warum? Voll Stoff und rechtzeitig wieder bremsen.
Ja schon, aber das bezieht sich ja auf a(t). Aber wir sind hier ja eine Ableitung weiter. Hier ist die Frage: Wie erreiche ich, das über ein Periode hinweg möglichst effizient voll Stoff gegeben wird und möglichst effizient abgebremst wird (dabei kann z.B. d3x/dt3 durchaus mal 0 bleiben, dann beschleunige ich immer noch konstant!).
Oder mach ichs komplizierter als es ist?
-
(da/dt nennt man Ruck, also sag ich dazu mal r.)
Der Anfahrvorgang sieht dann ungefähr so aus:- r springt auf rmax. a steigt linear, v quadratisch.
- amax ist erreicht. r springt wieder auf 0. v steigt nur noch linear.
- irgendwann kommt ein Punkt T1 , an dem r auf -rmax springen muss, so dass a wieder auf 0 zurückgefahren werden kann. Diesen Punkt legt man so, dass man vmax genau erreicht.
- dann r wieder auf 0. wir haben jetzt eine konstante geschwindigkeit.
- T2: jetzt alles wieder rückwärts mit umgekehrten Vorzeichen.
Die Punkte T1 und T2 muss man natürlich erstmal berechnen. Es gibt dabei leider haufenweise Spezialfälle, wenn die jeweiligen Maxima nicht in der Reihenfolge erreicht werden wie im Idealfall. Davon abgesehen ist das dann aber zeitoptimal.
Zusätzlich müsste man noch berücksichtigen, dass die Bremsbeschleunigung idR anders ist als die Anfahrbeschleunigung.
-
Hi,
sorry, ich kann mich nicht beherrschen...
Warum lässt du den Fahrstuhl nicht mit maximaler Geschwindigkeit beschleunigen und montierst an den Wänden Trägheitsdämpfer mit isolinearem Chipsatz (und LCARS 3.0)?
ChrisM
-
Das muss n Insider-Witz für Ingenieure sein. Ich versteh nämlich nur Bahnhof.
-
Ich fürchte das war ein Insiderwitz für Trekkies.
-
Hi,
Mehr über Trägheitsdämpfer: http://home.arcor.de/q_community/Technik/g_technik_a_16.htm
Der Rest steht als Konter auf die oberen Posts dabei, die ich nicht verstehe.
ChrisM