Mathematik: Dragster Rennen oder Minimiere eine Funktion von 4 Variablen
Released by matroid on Sa. 15. Januar 2022 16:54:00 [Statistics]
Written by Delastelle - 358 x read [Outline] Printable version Printer-friendly version -  Choose language   
Spiele+Rätsel

\(\begingroup\) David H.Ahl brachte um 1980 2 Bände Basic Computer Spiele heraus. In Band 2 findet sich "Dragster Rennen". Darin werden 4 Parameter eines Rennautos (Dragsters) festgelegt. Ziel ist, damit schneller als das Computer-Auto über die 1/4 Meile (etwas über 400m) in einem Beschleunigungsrennen zu sein. Mich hatte interessiert, wie schnell ein Dragster mit den 4 Parametern überhaupt sein kann.

1.Einleitung

(Bild 1: aus einem Autokartenspiel - ein Dragster beim Beschleunigen mit durchdrehenden Rädern) Zur Entstehungszeit des Buches "Basic Computer Games" waren Dragster Rennen vor allem in den USA sehr populär. Bei einem Dragster-Rennen fahren 2 Rennautos in einem Beschleunigungsrennen über die 1/4 Meile (etwas über 400 Meter). Gewinner ist, wer zuerst das Ziel erreicht. Es gibt verschiedene Klassen von Dragstern. Bei der Computer Umsetzung kann man 4 Parameter wählen: - Leistung (PS) - Untersetzung - Reifenbreite (in Zoll) - Durchmesser der Reifen (in Fuss) Ziel ist mit diesen Parametern schneller als das Computer Auto die Strecke zu bewältigen. Ich habe das Ziel abgewandelt - berechnet wird die benötigte Zeit des Autos in Abhängigkeit von den 4 Parametern. Gesucht wird eine möglichst kleine Zielzeit.

2.Das Basic Programm "Dragster Rennen"

(Bild 2: Einleitung und Programmlauf im Buch "Basic Computer Games Band 2" Sybex-Verlag 1983)
(Bild 3: Basic Quelltext 1 von 2)
(Bild 4: Basic Quelltext 2 von 2)

3.Bemerkungen und Fortran Umsetzung eines Zufallslaufs

Bemerkungen: (1) Neue Rennzeiten habe ich so ermittelt: - nimm eine Startkonfiguration der 4 Parameter - führe zufällig Änderungen(siehe unten) an den 4 Parametern durch - falls die Zeit besser geworden ist, nimm die neuen Parameter, sonst Reset auf die besten bekannten Parameter - dir zufällige Änderung für einen Parameter p ist: \sourceon Fortran call random_number(zwi2) p = p + (zwi2-0.5d0) * (p/500) \sourceoff (2) Eine Besonderheit des Basic Programms sind die Goto Anweisungen. Heute würde man Programme oft anders schreiben. (3) Je nach Parametern verschmort der Dragster zu Beginn des Rennens Gummi. Dies ist ein Zeichen von sehr starker Beschleunigung. (4) Die 4 Parameter bekommen obere und untere Grenzen und zwar (willkürlich von mir): 10 <= PS <= 100000 1 <= Untersetzung <= 2000 1 <= Reifenbreite(in Zoll) <= 50 1 <= Reifendurchmesser(in Fuss) <= 10 (5) ein Vergleich des Basic Programms und des Fortran Programms: - (Ahl ca.1980) PS = 600 // Unter = 5.90 // Br = 22.00 // Durch = 3.9 -> Zeit 9.86 Sekunden Basic - (Delastelle 2022) PS = 600 // Unter = 5.90 // Br = 22.00 // Durch = 3.9 -> Zeit = 9.825 Sekunden Fortran Es gibt also eine Abweichung zwischen den beiden Programmen - sie ist aber im Beispiel nicht sehr groß. Basic -> geringe Genauigkeit der Rechnung Fortran -> double Zahlen mit höherer Genauigkeit der Rechnung Das Fortran Programm gebe ich hier wieder: \showon Dragster.for \sourceon Fortran c Ahl Dragster Rennen c c Auto 2 c PS = 790 // Unter = 4.50 // Br = 22.00 // Durch = 4.00 // c Zeit = 9.888 (Ahl: mehr als 9.86 Sekunden) c c Auto 1 c PS = 600 // Unter = 5.90 // Br = 22.00 // Durch = 3.9 c Zeit = 9.825 (Ahl: 9.86 Sekunden) c c Lauf 1 Mio kkk c PS = 1035.29973654 // Unter = 7.02712090452 // Br = 27.5760472748 // Durch = 5.28588402266 c Zeit = 9.57960514242 program dragster implicit none character zwi integer i,t,t1,kkk double precision p,e,w,d,k1,k2,k3,k4,k5,k6,k7,k8, * q,s,x,m,c,merk,r,l0,l1,l2,y,f,a,t3,b,tende,merk2, * lala,talt,palt,ealt,walt,dalt,zwi2 c Spielerinput call random_seed() open (1,file='par.txt'); read(1,*) zwi read(1,*) p read(1,*) zwi read(1,*) e read(1,*) zwi read(1,*) w read(1,*) zwi read(1,*) d close(1) palt = p ealt = e walt = w dalt = d kkk = 0 talt = 100.0d0 call random_number(zwi2) lala = zwi2 11 k1 = 500 k2 = 1.6 k3 = 2 k4 = 6.0d-4 k5 = 6.0d-5 k6 = 0.2d0 k7 = 4 k8 = 1.5d-4 q = 0 s = 0 x = 0 m = (k1+k2*p+k3*w*d+k7*d*d)/32.2 c print *,'Gewicht = ',m merk = m*m c alternativ merk2 = m**(2.0d0/3.0d0) call wurzel3(merk2,merk) c = k4*merk2 + k8*w*d c print *,'Luftwiderstand = ',c b = 15+28*w*d/((w+6)*(d+1)) y = 3.7-3.3d-3*p c Start Rechnung do 100 t = 0,100 do 200 t1 = 1,100 r = 60*s*e/(3.1415926*d) l0 = (p/42.5)*(50+7.8d-3*(r/y))-4.0d-10* * (r/y)*(r/y)*(r/y) l1 = p*(k5*r+k6) l2 = e*(l0-l1) f = 2*l2/d if (f.gt.m*b) then goto 300 endif if (q.eq.0) then c print *,'Schmoren zuende' q = 1 endif a = (f-c*s*s)/m goto 400 300 a = b-c*s*s/m 400 s = s + a*0.01d0 x = x + s *0.01d0 if (x.lt.5280/4) then goto 200 endif t3 = (x-5280/4)/s tende = t+1.0d0*t1/100-t3 x = 5280/4 c print *,'Zeit = ',tende,' Speed = ',s*1.14545d0, c * ' Weg = ',x*0.34d0 goto 333 200 continue c print *,'Zeit = ',t+1,' Speed = ',s*1.14545d0, c * ' Weg = ',x*0.34d0 100 continue 333 if (talt.lt.tende) then p = palt e = ealt w = walt d = dalt else palt = p ealt = e walt = w dalt = d talt = tende print *,'PS = ',palt,' Unter = ',ealt,' Br = ', * walt,' Durch = ',dalt print *,' Zeit = ',talt endif kkk = kkk + 1 call random_number(zwi2) p = p + (zwi2-0.5d0) * (p/500) if (p.lt.10.0d0) then p = 10.0d0 endif if (p.gt.100000.0d0) then p = 100000.0d0 endif c if (p.gt.5000.0d0) then c p = 5000.0d0 c endif call random_number(zwi2) e = e + (zwi2-0.5d0) * (e/500) if (e.lt.1.0d0) then e = 1.0d0 endif if (e.gt.2000.0d0) then e = 2000.0d0 endif call random_number(zwi2) w = w + (zwi2-0.5d0) * (w/500) if (w.lt.1.0d0) then w = 1.0d0 endif if (w.gt.50.0d0) then w = 50.0d0 endif call random_number(zwi2) d = d + (zwi2-0.5d0) * (d/500) if (d.lt.1.0d0) then d = 1.0d0 endif if (d.gt.10.0d0) then d = 10.0d0 endif if (kkk.gt.1000000) then goto 5555 endif goto 11 5555 end c ******************************** c berechne die 3.Wurzel einer Zahl c ******************************** subroutine wurzel3(out,in) implicit none double precision ug,og,out,in,mg integer i ug = 0 og = in + 1 do 100 i = 1,40 c print *,'ug = ',ug,' og = ',og,' x = ',in, c * ' ug^3',ug*ug*ug mg = (og+ug)/2 if (mg*mg*mg.gt.in) then og = mg else ug = mg endif 100 continue out = ug c stop end \sourceoff \showoff und \showon par.txt PS = 600 Untersetzung = 5.9 Reifenbreite = 22.0 Reifendurchmesser = 3.9 \showoff Wer möchte kann mit Fortran ein anderes Abstiegsverfahren am Problem testen.

4.Ergebnisse und Abschluß

Ein paar Ausgaben des Fortran Programms (ein zufälliger Lauf des Programms "dragster.for"): PS = 600.000000000 Unter = 5.90000000000 Br = 22.0000000000 Durch = 3.90000000000 Zeit = 9.82526283312 ... PS = 961.948716184 Unter = 5.70519566485 Br = 24.4343403397 Durch = 4.08693456640 Zeit = 9.63856927257 ... PS = 1035.07865237 Unter = 7.02526185564 Br = 27.5956083588 Durch = 5.27721007647 Zeit = 9.57961538232 dragster(1035.2997, 7.0271, 27.5760, 5.2859) liefert eine Zeit von 9.5796 Sekunden. Dies sollte nahe am Optimum liegen sofern nicht irgendwo noch ein lokales Optimum versteckt ist.
(Bild 5: aus einem Autokartenspiel - Dragster beim Abbremsen mittels Fallschirm) ... Was man nicht vergessen sollte ... ein Dragster muss auch wieder abgebremst werden. Bei sehr hohen Geschwindigkeiten mit Fallschirmen! Danke fürs Lesen Ronald Schlagworte: Abstiegsverfahren, Zufallssuche, Nichtlineare Optimierung, schneller Artikel.
\(\endgroup\)
Get link to this article Get link to this article  Printable version Printer-friendly version -  Choose language     Kommentare zeigen Comments  
pdfFür diesen Artikel gibt es keine pdf-Datei


Arbeitsgruppe Alexandria Dieser Artikel ist im Verzeichnis der Arbeitsgruppe Alexandria eingetragen:
: Spiele+Rätsel :: automatisch eingefügt und unbearbeitet :: BASIC :: Optimierung :
Dragster Rennen oder Minimiere eine Funktion von 4 Variablen [von Delastelle]  
David H.Ahl brachte um 1980 2 Bände Basic Computer Spiele heraus. In Band 2 findet sich "Dragster Rennen". Darin werden 4 Parameter eines Rennautos (Dragsters) festgelegt. Ziel ist, damit schneller als das Computer-Auto über die 1/4 Meile (etwas über 400m) in einem Beschleunigungsrennen zu sein
[Die Arbeitsgruppe Alexandria katalogisiert die Artikel auf dem Matheplaneten]

 
 
Aufrufzähler 358
 
Aufrufstatistik des Artikels
Insgesamt 16 externe Seitenaufrufe zwischen 2022.05 und 2022.12 [Anzeigen]
DomainAnzahlProz
https://google.com956.3%56.3 %
https://google.de743.8%43.8 %

Aufrufer der letzten 5 Tage im Einzelnen
Insgesamt 3 Aufrufe in den letzten 5 Tagen. [Anzeigen]
DatumAufrufer-URL
2022.11.17-2022.12.06 (3x)https://google.com/

Häufige Aufrufer in früheren Monaten
Insgesamt 11 häufige Aufrufer [Anzeigen]
DatumAufrufer-URL
202205-10 (6x)https://google.com/
202209-09 (5x)https://google.de/

[Top of page]

"Mathematik: Dragster Rennen oder Minimiere eine Funktion von 4 Variablen" | 3 Comments
The authors of the comments are responsible for the content.

Re: Dragster Rennen oder Minimiere eine Funktion von 4 Variablen
von: Delastelle am: So. 16. Januar 2022 17:15:05
\(\begingroup\)Hallo, 2 Dinge würden mich interessieren: - ist das Berechnungsmodell physikalisch sinnvoll? - kann man hier ein Abstiegsverfahren (Gradienten etc.) gut verwenden? Viele Grüße Ronald\(\endgroup\)
 

Re: Dragster Rennen oder Minimiere eine Funktion von 4 Variablen
von: MontyPythagoras am: Mo. 14. Februar 2022 22:16:05
\(\begingroup\)Hallo Ronald, ich habe mich mal mit den Programmen auseinandergesetzt und erst einmal die Formeln in physikalischen Sinn zu übersetzen versucht. Was die Sache unheimlich erschwert, sind zwei Dinge: * Die Formeln beruhen auf amerikanischen Einheiten * Die Programme benutzen unübliche Variablennamen. Z.B. ist $s$ üblicherweise der Weg, wird hier aber für die Geschwindigkeit verwendet (s wie speed, vermutlich). Nachdem ich das alles übersetzt habe, kann ich sagen, dass die Formeln schon einigermaßen plausibel sind. Der Leistungsverlauf ist typisch für einen Verbrennungsmotor. Etwas seltsam ist die Formel für "y", die bedeutet, dass wenn die Leistung größer ist als 1121PS, die Maximaldrehzahl des Motors auf null sinkt. Größere Leistungen zu untersuchen macht also keinen Sinn. Rollwiderstand wird nicht berücksichtigt, nur Luftwiderstand. Dafür ist ein Reibmoment innerhalb des Motors berücksichtigt, also das passt einigermaßen. Das heißt summa summarum, dass das Formelwerk per se zwar plausibel ist, aber ob realistisch vermag ich nicht zu sagen. Wie dem auch sei, ich habe eine deutlich genauere Berechnung in Python umgesetzt. In den gezeigten Programmen wird immer nur linear integriert (also z.B. $s=s+v\cdot dt$), was ja nur dem ersten Glied einer Taylorreihe entspricht. Wenn man die Formeln passend ineinander einsetzt, kann man eine Formel für die Beschleunigung in Abhängigkeit von der Geschwindigkeit herleiten, also $a(v)$. Damit habe ich die ersten drei Folgenglieder der jeweiligen Taylorreihe berechnet. Außerdem berechne ich den letzten Schritt, wenn das Auto über die Ziellinie fliegt, als Wegschritt, nicht als Zeitschritt, so dass ich die Zeit bei exakt 1320 Fuß Gesamtdistanz berechne. Lange Rede, kurzer Sinn: Bei Deinen Parametern bekomme ich als Zeit 9.586727s. Das Optimum, welches ich gefunden habe, erreicht eine Zeit von 9.585994s, also rund 0.7ms schneller. Vielleicht probierst Du die folgenden Werte mal aus: P = 1037.713194948176 e = 7.008406628118148 w = 27.5813234713991 d = 5.287822039688064 Ciao, Thomas \(\endgroup\)
 

Re: Dragster Rennen oder Minimiere eine Funktion von 4 Variablen
von: Delastelle am: Di. 15. Februar 2022 20:10:16
\(\begingroup\)Hallo Thomas! Das eigentliche Programm ist kurz vor 1980 erstmals erschienen. Wahrscheinlich in der US Zeitschrift "Creative Computing". Damals mit Basic waren lange Variablennamen nicht üblich - Speicherplatz war sehr knapp. Ich mag an Ahls Basic Programmen die Vielfalt und den Einfallsreichtum. Es geht um kurze Programme die Spaß machen sollen. Beim "Dragster Rennen" hat mir gefallen, dass auch das hier eine Funktion von 4 Variablen sein kann. Zu Beginn, wenn die Beschleunigung sehr stark ist, kann Gummi der Reifen verbrannt werden. Dies endet aber irgendwann. Die PS-Zahl soll zu einem Motorgewicht/Fahrzeuggewicht führen. Damit wird die PS-Zahl begrenzt. Als ich in den 1980er Jahren das Programm zum ersten mal gesehen habe, war mir nicht klar, wie man zu besseren Zeiten kommen kann. Auch hatte ich es um 1988 mit unserem Commodore Plus 4 noch nicht umgesetzt. Erst später fiel mir auf, dass man in der "Nähe" der Parameter des Computerautos wohl bessere Zeiten finden kann. Kurz nach dem Jahr 2000 waren Computer ca. 1000 MHz schnell. Damit über 1000 mal schneller als 1980. Zu Basic gab es um 1980 wahrscheinlich nur Interpreter. Diese waren auch noch mal 100x langsamer als ein Fortran-Compiler. Somit waren die ersten Versuche zu "Dragster Rennen" um 1980 ein Geduldsspiel(Rechenzeit). Eine Diskussion wurde von mir eröffnet: https://www.matheplanet.de/matheplanet/nuke/html/viewtopic.php?topic=257560&start=0&lps=1870245#v1870245 Viele Grüße Ronald \(\endgroup\)
 

 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2022 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]