Seite 1 von 1

Mathematisches Problem

Verfasst: 28.04.2009 23:31
von KeyKon
Ich habe mit Dingen dieser Art nich viel am Hut, deswegen frag ich lieber gleich ob hier jemand ne gute Lösung parat hat.
Folgendes Problem:
Ich möchte zwischen Zeit a und Zeit b X mal ein Ereignis ausführen, diese Ereignisse sollen zum Mittelpunkt der Zeit hin immer häufiger geschehen und dann wieder weniger werden, und das möglichst gleichmäßig (Sozusagen eine Gauß-Verteilung)...
Wie stelle ich das am geschicktesten an?

Verfasst: 29.04.2009 00:21
von TomS
Mit der Funktion

Code: Alles auswählen

y=abs(cos(x)-1)
bekommst du für a=0 und b = 2*#PI eine schöne Gauß-Verteilung

Bild

Der Y-Wert bestimmt jetzt die Häufigkeit des Events.

Andersrum kannst du mit dem Y-Wert die Länge der Pausen angeben (am Anfang und am Ende lange Pausen und in der Mitte kurze Pausen)

Die Funktion sieht dann so aus

Code: Alles auswählen

y=sin(x+#pi/2)+1
Bild

Verfasst: 29.04.2009 00:28
von Kaeru Gaman
das war auch mein erster ansatz. (immerhin hatte ich schonmal eine solche verteilung von zufallszahlen über einen arcussinus gelöst)

das problem ist aber wohl hier, dass die Gesamtanzahl der Ereignisse vorher feststeht, dadurch wird das ganze etwas komplexer.
man hat praktisch die Summe der funktionswerte über eine ganze Phase gegeben, und muss daraus die Amplitude errechnen.

Verfasst: 29.04.2009 00:30
von STARGÅTE
ich habe da mal n kleinen Code gemacht:

Code: Alles auswählen

#E    = 2.718281828459045
 
#Genau = 50 
 
Procedure GaussBeep(Time, Counts)
 Counts+1
 DeltaTime = Time/#Genau/2
 For n = -#Genau To #Genau
  Delay(DeltaTime)
  x.f = n*3/#Genau
  y.f + 1/Sqr(2*#PI)*Pow(#E,-0.5*x*x)*Counts/#Genau*3
  Hight = Int(y)
  For i = 1 To Hight
   Beep_(400,10)
  Next
  y - Hight
 Next 
EndProcedure

GaussBeep(10000, 50)
Er spielt halt in der gegebenen Zeit (hier 10000ms) genau 50 Beeps ab, die dabei Gausförmig innerhalt der 10s verteilt sind...
Ob dir das weiter hilft weiß ich nicht ^^

EDIT: Fragen dazu erst morgen, bin nun schlafen /:->

Verfasst: 29.04.2009 12:42
von TomS
@Kaeru
Er hat ja ein mathematisches Problem. Ob mein Ansatz hilfreich ist, weil er damit umgehen kann, oder nicht, steht auf einem anderen Blatt ;)

Aber: Nicht verzagen, STARGÅTE fragen.

Verfasst: 29.04.2009 13:16
von STARGÅTE
ich habe noch mal TomS' Idee aufgenommen mit Sin bzw ich jetzt sin² zu arbeiten.
Bei der Gaußfunktion ist ja das problem das ich in wirklichkeit nie 0 annimmt sondenr immer nur sehr dicht rankommt.
Bei Sin² weiß ich jedoch exakt das der Flächeninhalt zwischen 0 und PI genau PI/2 ist.

Ob das jetzt schöner ist weiß ich nicht, ich gebe zu das dieses Beep_() nicht die richtige Funktion ist, aber hier mal der Code:

Code: Alles auswählen

#E    = 2.718281828459045 
  
#Genau = 50 
  
Procedure MyBeep(Time, Counts) 
 Counts+1 
 DeltaTime = Time/#Genau/2 
 For n = 0 To #Genau 
  Delay(DeltaTime) 
  x.f = n*#PI/#Genau 
  y.f + Sin(x)*Sin(x)*Counts/#Genau*2
  Hight = Int(y) 
  For i = 1 To Hight 
   Beep_(400,10) 
  Next 
  y - Hight 
 Next 
EndProcedure 

MyBeep(10000, 50) 

Verfasst: 29.04.2009 17:17
von Little John
Man kann auch die symmetrische Binomialverteilung nehmen.

Gruß, Little John

Verfasst: 29.04.2009 23:52
von KeyKon
Danke für die vielen Tipps, ich denke ich habs jetz hinbekommen:

Code: Alles auswählen

Procedure MyDraw(start, stop, Counts)
 Global Dim Times(Counts)
 Time = stop-start
 Counts+1
 starttime = ElapsedMilliseconds()
 For n = 0 To Time
   x.d = n*#PI/Time
   y.d + Sin(x)*Sin(x)*Counts/Time*2
   Hight = Int(y)
   For i = 1 To Hight
    Times(index) = x*Time/#PI
    index+1
   Next
   y - Hight
 Next
EndProcedure
In meinem Fall wird ein Array mit den Entsprechenden Timestamps gefüllt, das Array kann dann einfach Abgearbeitet werden...