Mathematisches Problem

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
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

Beitrag 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?
(\/) (°,,,°) (\/)
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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 /:->
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
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Beitrag 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.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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) 
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
Little John

Beitrag von Little John »

Man kann auch die symmetrische Binomialverteilung nehmen.

Gruß, Little John
Benutzeravatar
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:

Beitrag 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...
(\/) (°,,,°) (\/)
Antworten