Mathematisches Problem
- KeyKon
- Beiträge: 1412
- Registriert: 10.09.2004 20:51
- Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit) - Wohnort: Ansbach
- Kontaktdaten:
Mathematisches Problem
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?
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?
(\/) (°,,,°) (\/)
Mit der Funktion
bekommst du für a=0 und b = 2*#PI eine schöne Gauß-Verteilung

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=abs(cos(x)-1)

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

-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
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.
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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
ich habe da mal n kleinen Code gemacht:
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
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)
Ob dir das weiter hilft weiß ich nicht ^^
EDIT: Fragen dazu erst morgen, bin nun schlafen

PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
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:
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)
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
- KeyKon
- Beiträge: 1412
- Registriert: 10.09.2004 20:51
- Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit) - Wohnort: Ansbach
- Kontaktdaten:
Danke für die vielen Tipps, ich denke ich habs jetz hinbekommen:
In meinem Fall wird ein Array mit den Entsprechenden Timestamps gefüllt, das Array kann dann einfach Abgearbeitet werden...
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
(\/) (°,,,°) (\/)