Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Muecke Gast
|
Verfasst am: 21.01.2014, 15:01 Titel: Komplexeres Rechnen in FB |
|
|
Hallo miteinander,
noch verstehe ich nicht sonderlich viel von Extrempunktberechnen geschweige habe verstanden wie das nur im Ansatz gehen soll.
was ich jedoch glaube ich bisher verstanden habe ist das wenn ich Extrempunkteberechnen möchte eine Funktion benötige die z.B. ein Taschenrechner hinterlegt hat
Hoffe das ich das Richtig Interpretiere, in der Funktion (Taschenrechner) ist eine Art kleines Programm hinterlegt das dort vergleiche Analysen etc. macht, ist so was in FB schon hinterlegt? oder muss ich mir für solche Rechnungen etwas Importiren? oder wie macht man so was im allgemeinen? |
|
Nach oben |
|
|
Elor
Anmeldungsdatum: 12.07.2013 Beiträge: 205 Wohnort: Konstanz
|
Verfasst am: 21.01.2014, 15:49 Titel: |
|
|
Hallo,
gib mal bei Google Extrempunktberechnen ein und schau mal was dann passiert. |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 21.01.2014, 16:10 Titel: |
|
|
Für solche Berechnungen verwendet man am besten ein Computer-Algebra-System (CAS). FreeBASIC, VisualBASIC, C++, ... bieten keine spracheigenen Mittel, um Extrempunkte irgendwelcher Funktionen (ganzrationale Funktionen? trigonometrische Funktionen? ...) zu berechnen.
Je nachdem, um was es genau geht, könnte man eine Nährung aber auch einfach durch "Ausprobieren" ermitteln. Wenn du z. B. weißt, dass irgendwo zwischen 0 und 10 der Extrempunkt ist, kannst du mit einer FOR-Schleife in 0.001er-Schritten ausprobieren, wo der liegt. _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
|
Muecke Gast
|
Verfasst am: 21.01.2014, 17:10 Titel: |
|
|
hmm also das bei Google das habe ich gemacht, wie ich schon sagte ich kenne mich damit noch nicht sonderlich aus noch bin ich am Heraussuchen von Infos und Lesen und Hoffentlich auch irgend wann mal das verstehen was ich da Lese .
Hmm OK, habe verstanden für solche Sachen ist FeeBasic schlecht geeignet
Um was es geht, ich möchte aus meinen Daten die ich von der Zeilenkammer Bekomme z.B. alle Wendepunkte bestimmen die ich dort habe, ...
Mir sagte man das ich mich mit den Extrempunkte befassen solle dafür das würde dann einfach werden
jetzt bin ich so weit das ich mir meine Daten Endlich anzeigen lassen kann daher Befasse ich mich mit der Erstellung des Erkennen der Wendepunkte.
und dem was mir dann noch alles einfallen wird was ich benötigen werde
Das mit den For Schleifen werde ich wahrscheinlich auch so machen mit den Daten selbst die ich da habe.
zuerst werde ich jedoch noch mein KKleiner... (neue Version) richtig einbauen und das Überflüssige zeig raus schmeißen, aus meinem Code.
Danke für euer Feedback. |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 21.01.2014, 18:12 Titel: |
|
|
Hallo,
dir geht es also darum, in einem 2D-Pfad aus diskreten Einzelwerten (= 1 gelesene Zeile) die höchsten Stellen ("Peaks") zu finden? Dafür braucht es ja nicht mal Analysis.
Du könntest ja einfach die Werte der Zeile von Anfang bis Ende durchgehen und ganz nach Bedarf nach den Mustern suchen. Zum Beispiel "Erhebung liegt 30% über Durchschnittsniveau" (je nach dem, wie deutlich die "Zacke" sein muss, um zu zählen) oder "ist absolut höchste Stelle des Datensatzes" oder ... - ganz wie du's brauchst.
Wenn du es nach dem Schema einer klassischen Kurvendiskussion lösen wolltest, müsstest du ja erst mal deine "Wertelinie" durch ein Polynom approximieren. Und dann mithilfe der Ableitungen der Funktion die Extremstellen finden.
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Zuletzt bearbeitet von Sebastian am 21.01.2014, 18:14, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2508 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 21.01.2014, 18:14 Titel: |
|
|
Am besten noch kurz einen Blick ins Thread-Mandelbrot werfen, dort ist eine Klasse (UDT in FB) für komplexe Zahlen vorhanden -> lässt sich nach Belieben noch um weitere Rechenoperationen ergänzen. Danach kannst Du Berechnungen im Code so formulieren, als wären komplexe Zahlen einen Sprachbestandteil.
Zu Extrempunkte bzw. Werte:
http://de.wikipedia.org/wiki/Extremwert
Übrigens Juliamengen und Mandelbrotmengen und deren Verwandte haben auch mit diesem Thema auch zu tun: Wenn Du rein numerisch diese Stellen suchst, z.B. ein Polynom, jeder Nullstelle der Ableitung (=dort werden die Extrempunkte zu Nullstellen!) eine Farbe zuweist und eine Grafik erstellst, wo farblich gekennzeichnet wird, wohin die numerische Suche von einem bestimmten Startwert aus konvergiert, so entsteht das Newton-Fraktal. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
Muecke Gast
|
Verfasst am: 21.01.2014, 18:28 Titel: |
|
|
ja es handelt sich um reine 2D Ansicht.
so in die Richtung dachte ich mir das auch schon bin mir noch nicht so ganz im Klaren wie ich das Umsätze also Programmiertechnisch
ps. ich merke schon Mathematisch habt Ihr deutlich mehr drauf als ich , ich muss erst ein mal eure Postes auseinander nehmen und schauen was da genau steht und alles nachschlagen, bitte um etwas Geduld mit mir. |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1212 Wohnort: Ruhrpott
|
Verfasst am: 22.01.2014, 10:14 Titel: |
|
|
@Sebastian & dreael:
Macht den Jungen doch nicht so fertig, der läuft doch jetzt schon mit Übertemperatur!
@Muecke:
Für das, was du vorhast, brauchst du keine höhere Mathematik, sondern nur solide Integerarithmetik.
Der Denkansatz ist ganz einfach: Du gehst an der Zeile entlang und vergleichst jeden Wert mit dem Vorhergehenden. Sobald die Differenz der beiden Werte das Vorzeichen wechselt, hast du deinen Extrempunkt gefunden. _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Muecke Gast
|
Verfasst am: 22.01.2014, 12:25 Titel: |
|
|
oh ja das macht mir Kopfzerbrechen das ist richtig
das mit dem Positiven und Negativen wert habe ich schon Probiert,
habe auch mal versucht wenn Abweichung zum vorherigen Punkt Größer als ist dann erst zu reagieren doch bis jetzt ohne großen Erfolg.
habe da mal ein Bild meines Programme das ich bis jetzt geschrieben habe um mir das Darzustellen, (Soory für die schlechte Qualität doch das Bild ist sonst 1900 px breit das ist etwas viel für das Forum.
mit gelb habe ich markiert was ich versuch zu finden.
um euch die Daten nicht vorzuenthalten habe ich mein bisheriges Programm inkl. Daten Datei angehängt.
https://dl.dropboxusercontent.com/u/130479015/Forum/FreeBasic/Version%200.2.0.zip
Welchen Ansatz würdet Ihr hier verfolgen?
was sollte ich mir mal genauer anschauen?
was meint Ihr dazu?
ps. Rote Punkte bedeutet das die Daten vorhanden sind.
Grüne Linie bedeutet das der Letzte bekannte Punkt mit dem nächsten Bekannten Punkt verbunden wurde die Werte dazwischen sind entweder 0 oder nicht vorhanden. |
|
Nach oben |
|
|
TimesChange
Anmeldungsdatum: 20.11.2013 Beiträge: 85
|
Verfasst am: 22.01.2014, 15:42 Titel: |
|
|
Ich würde das so angehen wie oben mehrfach vorgeschlagen:
Einfach die Datenpunkte der Reihe nach abklappern und auf Änderungen untersuchen.
Wahrscheinlich würde ich mir dazu zwei Functions machen wie Knick(i) und Extrem(i) wobei i die Nr. des Punktes (mit x und y Wert) ist.
Wenn deine Daten auch ein gewisses "Rauschen" enthalten ist es vielleicht am besten, jeweils einige Punkte (abhängig von "Auflöung") vor und nach i mit einzubeziehen.
Bei "Knick" könntest du z.B. untersuchen, ob die mittlere Differenz der y-Werte der 5 Punkte nach i um einen gewissen Betrag oder Prozentsatz höher ist als die der 5 Punkte vor i. Nur mal als ersten Denkanstoß.
Vielleicht magst du auch nochmal die x/y-Wertepaare des ersten Zackens (mit etwas Vor- und Nachlauf) in einer txt-Datei anhängen.
Grüße
Rainer |
|
Nach oben |
|
|
Muecke Gast
|
Verfasst am: 22.01.2014, 15:53 Titel: |
|
|
so was in die Richtung hab e ich mir auch vorgestellt.
wie machst du dass wenn du sagen wir 5 aufeinander folgende y Werte hast
Y1 = 10
Y2 = 15
Y3 = 14
Y4 = 16
Y5 = 16
hier ist ja ein Anstieg zu verzeichnen doch wie Stelle ich das Mathematisch da?
denn auch Hie ist ein Anstieg zu verzeichnen.
Y1 = 10
Y2 = 15
Y3 = 16
Y4 = 14
Y5 = 14
in der Zip Datei befindet sich eine CSV Datei in der befinden sich alle X und Y werte.
14 Frames (Y Linien) insgesamt.
{Die Wertesparre werde ich raus suchen von der ersten Knick nach unten sobald ich wider den WIN Rechner an habe, gerade ist der Mac an} |
|
Nach oben |
|
|
Muecke Gast
|
Verfasst am: 22.01.2014, 17:30 Titel: |
|
|
so habe man die Werte in eine Extra TXT Datei schreiben lassen
Zeile begibt mit "X_Werte" bzw "Y_Werte"
Visualisiert sieht das dann so aus.
Es begibt mit Daten und Endet mit Daten, zwischen drin ist eine Strecke an der Daten Fehlen die Fehlen auch in der TXT
die TXT Datei https://dl.dropboxusercontent.com/u/130479015/Forum/FreeBasic/Erster_Bogen.txt
wie gesagt das Komplette Programm habe ich Oben schon verlinkt in dort ist auch die Original Datendatei als CSV dabei. |
|
Nach oben |
|
|
ThePuppetMaster
Anmeldungsdatum: 18.02.2007 Beiträge: 1837 Wohnort: [JN58JR]
|
Verfasst am: 23.01.2014, 13:13 Titel: |
|
|
Code: |
dim tshift as integer = 5
dim tdir as integer = iif(array(1) < array(2), 0, 1)
dim tval as integer
for x = lbound(array) to ubound(array) - 1
if tdir = 0 Then
if (tval < (array(x) - tshift)) Then
print "wird groesser"
tdir = 1
tval = array(x)
end if
else
if (tval > (array(x) + tshift)) Then
print "wird kleiner"
tdir = 0
tval = array(x)
end if
end if
next
|
ungetestet .. aber könnte funzen.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
|
Muecke Gast
|
Verfasst am: 23.01.2014, 20:41 Titel: |
|
|
Hmm, kannst du mir erklären was dein Code da macht?
ich versteh da nur Bahnhof
würde das gerne mal bei mir in den Code einbauen. |
|
Nach oben |
|
|
ThePuppetMaster
Anmeldungsdatum: 18.02.2007 Beiträge: 1837 Wohnort: [JN58JR]
|
Verfasst am: 23.01.2014, 20:46 Titel: |
|
|
Naja .. prinzipiel mache ich nichts anderes als folgendes:
Zuerst wird eine variable gesetzt die angibt, in welche richtung sich die änderung vollziehen muss. Diese variable wird anhand der ersten beiden arraywerte definiert.
ist arraywert1 kleiner als der in 2, dann ist aktuell eine steigende kurve vorhanden, ansonsten eine fallende ... dies wird jeweils als 0 oder 1 in TDir mittels IIF geschrieben.
anschliessend wird jeder arrayeintrag durchlaufen (FOR schleife). Sollte sich der wert bei dem aktuellem arrayeintrag X (for schleife) gravierend (abhängig von TShift) in die entgegen gesetzte richtung (< oder >, je nach TDir) ändern, dann erfolgt eine Print ausgabe. Zusätzlich wird die richtugn umgeschaltet (TDir ändern).
So sollte es eigentlich funzen. aber der source (sehe ich gerade) hat da wohl noch so seine makken .. hab das nur kurz hin "gerotzt" ... ich bastel da ma kurz was ... sec...
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
|
ThePuppetMaster
Anmeldungsdatum: 18.02.2007 Beiträge: 1837 Wohnort: [JN58JR]
|
Verfasst am: 23.01.2014, 21:55 Titel: |
|
|
Code: | 'Datenvariablen
Dim TDatenD() as Integer 'Test-Daten-Array
Dim TDatenC as Integer 'Anzahl der einträge im Test-Daten-Array
'array mit 600 speziellen zufälligen werten füllen
Randomize(Timer())
TDatenC = 600
Redim TDatenD(TDatenC) as Integer
For X as Integer = 2 to TDatenC
TDatenD(X) = TDatenD(X - 1) + (-10 + Int(Rnd * 21))
Next
'hier suchen wir nach den "umkerhpunkten".
Dim TDatenM() as Integer 'Ein Neus Array, welches die Position der Umkerhpunkte speichert
Redim TDatenM(TDatenC) as Integer 'Wir machen das Arra ygenauso gross wie das der daten. Jeder umkerhpunkt
'wird am selben index als 0(ncihts), 1(wird groeser) oder 2(kleiner) gespeichert.
Dim TShift as Integer = 25 'Hier legen wir fest, wie gross die änderung sein muss, damit sie erkannt wird
'Der wert muss also min. um min. 25 gröser oder kleiner sein, damit eine änderung eintritt.
'damit
Dim TDir as Integer = IIf(TDatenD(1) < TDatenD(2), 1, 2) 'Hier wird die startrichtung festgelegt
Dim TVal as Integer = TDatenD(1) 'ein temporärer speicher für steigungs werte
For X as Integer = 2 to TDatenC
If TDir = 1 Then
If TVal < TDatenD(X) Then TVal = TDatenD(X) 'NUR wenn der zwischenspeicher KLEINER ist, dann auffüllen
If TVal > (TDatenD(X) + TShift) Then 'wenn der arraywert mit dem shift kleiner ist, dann haben wir eine Änderung
TDatenM(X) = TDir 'die stelle markieren
TDir = 2 'richtungsänderung
TVal = TDatenD(X) 'den neuen zwischenwert abspeichern
End If
Else 'hier ist TDir = 1
If TVal > TDatenD(X) Then TVal = TDatenD(X) 'Nur wenn er größer ist ...
If TVal < (TDatenD(X) - TShift) Then
TDatenM(X) = TDir
TDir = 1
TVal = TDatenD(X)
End If
End If
Next
'Daten zeichnen
ScreenRes 800, 600, 32 'Grafikfenster öffnen
Line (10, 400)-(TDatenC + 30, 400), &HFF777777 '0-Linie (grau)
For X as Integer = 1 to TDatenC - 1 'Alle einträge durchgehen
If TDatenM(X) = 1 Then 'wenn 1, dann fallend
Line (20 + X, 0)-(20 + X, 600), &HFFFF0000 'roter marker für fallend
ElseIf TDatenM(X) = 2 Then 'wenn 2 dann steigend
Line (20 + X, 0)-(20 + X, 600), &HFF00FF00 'grüner marker für steigend
End If
Line (20 + X, 400 - TDatenD(X))-(21 + X, 400 - TDatenD(X + 1)), &HFFFFFFFF 'linie zwischen 2 elementen zeichnen
Line (20 + X, 400 - TDatenD(X))-(21 + X, 400 - TDatenD(X + 1)), &HFFFFFFFF 'linie zwischen 2 elementen zeichnen
Next
'solange warten bis ESC gedrückt wurde
Do Until InKey() = Chr(27)
Sleep 10, 1
Loop
end 0
|
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
|
Muecke Gast
|
Verfasst am: 24.01.2014, 14:46 Titel: |
|
|
Das sieht echt gut aus, danke.
Dank des Forums habe ich nun so viel hin bekommen Danke.
DANKE
Ihr seit der Hammer. |
|
Nach oben |
|
|
ThePuppetMaster
Anmeldungsdatum: 18.02.2007 Beiträge: 1837 Wohnort: [JN58JR]
|
Verfasst am: 24.01.2014, 14:54 Titel: |
|
|
Du könntest es natürlich auch etwas anders machen .. sehe gerade nochmal dein beispielbild an ...
meien Variante erkennt bei bestimmten einfachen schwellwerten eien änderung.
für dein Bild wäre hier wohl mehr etwas mit einer summe über mehrere elemente sinvoll.
Sprich: du nimmst z.B. 10 werte des arrays, summierst sie (+) und teilst diese durch die anzahl (z.B. 10) .. dann hast du eine quersumme ... die speicherst du temporär zwischen. Jetzt wiederholst du das ganze aber mit +1 versetzt. (die for schleife) .. wen sich jetzt die summe gravierend vom temporären ergebniss absetzt, dann tritt auch eine Änderung der richtung ein. Die richtung ist hierbei undefiniert. Aber du erkennst so nicht nur steigung und gefälle, sondern auch steigungsänderungen .. sprich, wenn du eine steigung von 1 pixel hast, und das über 100 pixel, dann ist diese gleichbleibend, und die werte bei der berechnung sind immer identisch .. steigt jetzt aber die steigung von sagen wir 1px pro pixel auf 2px pro pixel an, dann ändert sich auch die steigung. Das kann man dann auch erkennen. (was bei meiner obrigen variante nicht der fall ist. Diese erkennt nur den umkerhrpunkt. jedoch nicht eine steigungsänderung.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
|
Muecke Gast
|
Verfasst am: 24.01.2014, 15:00 Titel: |
|
|
Das mit der Steigung Veränderung ist gut, so habe ich einen Trend und kann diesen verfolgen bei Änderung des Trend (%+-) kann ich reagieren |
|
Nach oben |
|
|
TimesChange
Anmeldungsdatum: 20.11.2013 Beiträge: 85
|
Verfasst am: 24.01.2014, 15:15 Titel: |
|
|
Hast du das Excel-Beispiel, dass ich dir geschickt habe, noch nicht in FB-Code umgesetzt? Entspricht ja in etwa der letzten von Puppetmaster vorgeschlagenen Variante.
Grüße
Rainer |
|
Nach oben |
|
|
|