 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
FreeBASIC_Jockey
Anmeldungsdatum: 26.05.2012 Beiträge: 5
|
Verfasst am: 26.05.2012, 22:13 Titel: FunktionsWerte ueber FB-Funktion an *.txt file ausgeben |
|
|
Hallo,
Ich verwende Free Basic hauptsaechlich fuer Berechnungen.
Aktuell habe ich eine Funktion mit 2 Variablen, X=F(X), wobei
X = (1;6).
dabei habe ich einen sehr einfachen quellcode:
for 1 = X to 6 step 0.1
x=f(X)
print X
print f(X)
next X
SLEEP
Die ermittelten Werte will ich in eine .txt datei speichern. (also so wie sie nach der Berechnung angezeigt werden)
Kann mir jm. mit dem entsprechenden Befehl auf die Spruenge helfen, stehe grade auf dem Schlauch.
Und zweitens: Mit welchem Werkzeug kann ich die Funktionsgraphen aus der obigen Funktion plotten, d.h. graphisch uebersichtlich darstellen. Will die txt nicht in Excel exportieren sondern mir mgl jeden unnoetigen Zwischenschritt sparen.
Danke schonmal fuer die Hilfe! |
|
Nach oben |
|
 |
HorstD
Anmeldungsdatum: 01.11.2007 Beiträge: 110
|
Verfasst am: 26.05.2012, 22:37 Titel: |
|
|
Code: | OPEN "Datei.txt" FOR OUTPUT AS #1
FOR 1 = X TO 6 STEP 0.1
x=f(X)
PRINT X
PRINT f(X)
PRINT #1, str(x)
PRINT #1, str(f(x))
NEXT X
CLOSE
SLEEP
|
|
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 27.05.2012, 02:29 Titel: |
|
|
Außerdem sollten Zählvariablen niemals Gleitkommazahlen sein, sondern Integers (Ganzzahlen) - Sonst werden da ganz schnell falsche Werte berechnet.
Code: | OPEN "Datei.txt" FOR OUTPUT AS #1
FOR x as integer = 1 to 60
dim as single xs = x
dim as single ergebnis = f(xs / 10)
PRINT xs
PRINT ergebnis
PRINT #1, str(xs)
PRINT #1, str(ergebnis)
NEXT X
CLOSE
|
(Ungetestet) _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
FreeBASIC_Jockey
Anmeldungsdatum: 26.05.2012 Beiträge: 5
|
Verfasst am: 27.05.2012, 18:05 Titel: |
|
|
Hey zusammen,
Danke fuer die schnelle Antwort. Und siehe da, es funktioniert!
Jojo:
Danke fuer den Hinweis, koennte sein, dass ich es mir da zu leicht machen wollte.
Werde die Berechnung von F(x) in die Schleife verlegen und den Code anpassen dass 3 Variablen unabhaengig voneinander deklariert werden koennen (also die Schleifenvar. als Integer, die uebrigen als Gleitkommazahl fuer die Berechnungen).
Muesste funktionieren, kann den fertigen Code ja anschliessend posten. Bitte noch ein wenig Geduld...
Gruesse, |
|
Nach oben |
|
 |
FreeBASIC_Jockey
Anmeldungsdatum: 26.05.2012 Beiträge: 5
|
Verfasst am: 05.06.2012, 18:49 Titel: |
|
|
So, basierend auf meinem Ausgangsproblem (welches ich zwischenzeitlich dank Eurer Hilfe geloest habe) habe ich meinen Code weiterentwickelt.
Der Code unten berechnet ausgehend von einem Array die Ergebnisse der drei binomischen Formeln. Folgerichtig dreht sich mein Code um:
1. y(x) x+1)*(x+1) , 1. binom Formel
2. y(x) x+1)*(x-1) , 2. binom Formel
3. y(x) x-1)*(x-1) , 3. binom Formel
Das Programm berechnet alle abhaengigen Werte und gibt die Ergebnisse in die txt-Datei "Werte.txt" aus.
Code: | dim as single x, y(x), z(x), w(x)
dim as single xmin, xmax
OPEN "Werte.txt" FOR OUTPUT AS #1
'Definiert die Ober- und Untergrenze des X-Wertebereichs
input "Untergrenze; ", xmin
input "Obergrenze; ", xmax
'Druckt die Spaltenbeschriftungen in das Ausgabedokument
print #1, " x " &";",
print #1, " (x+1)*(x+1) " &";",
print #1, " (x-1)*(x-1) " &";",
print #1, " (x+1)*(x-1) " &";"
'Fuehrt die Rechenschleife aus und druckt die Ergebnisse in das Ausgabedokument
for x = xmin to xmax step 0.5
y(x)=(x+1)*(x+1) 'Berechnung erste binomische Formel
z(x)=(x-1)*(x-1) 'Berechnung zweite binomische Formel
w(x)=(x-1)*(x+1) 'Berechnung dritte binomische Formel
print #1, x &";",
print #1, y(x) &";",
print #1, z(x) &";",
print #1, w(x)
sleep 1
next x
print "Berechnung abgeschlossen. "
sleep |
Stelle beim Durchrechnen von grossen Wertebereichen (z.B. -25 bis 25) fest, dass mir mein Programm abschmiert. Weiss jemand eine praktikable Loesung wie ich die Werte geschmeidig speichern kann ohne dass mein Rechner streikt bzw. wo liegt eigtl. das Problem welches die Programmabstuerze verursacht?
Im Wertebereich 10 bis 50 werden die ersten ca. 50 Ergebnisse der 2. binom Formel mit '0' zurueckgegeben. Danach rechnet das Prog. sauber weiter. Kann also an der Formel nicht liegen, was ist denn da los?
Wuerde mich freuen falls jm. eine Idee hat u hier mitteilt, bin schon ganz frustriert. |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 05.06.2012, 18:57 Titel: |
|
|
Code: | dim as single x, y(x), z(x), w(x) |
definiert (unter anderem) drei Arrays y, z und w, jeweils mit oberer Grenze x, also zum Startzeitpunkt identisch mit
Code: | dim as single x, y(0), z(0), w(0) |
Das ist auf jeden Fall nicht das, was du haben willst ...
Lass doch stattdessen das ganze y(x) usw. weg und nimm nur
Code: | y = (x+1)*(x-1)
' ...
print #1, y & "; "
' ... |
Was du da mit y(x) bezwecken willst (Schreibweise als Funktion) ist nicht das, was der Compiler darunter versteht (Schreibweise als Array). _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
FreeBASIC_Jockey
Anmeldungsdatum: 26.05.2012 Beiträge: 5
|
Verfasst am: 05.06.2012, 21:13 Titel: |
|
|
nemored,
Habe y(x) nicht als Funktionsschreibweise gemeint, sondern als Array.
Habe die Schreibweise auf die Funktion y=... reduziert - klappt, ok.
Aber den Unterschied verstehe ich nicht. Da ich eine Unter- und eine Obergrenze festlege und ueber die 'for - next' Schleife definiere dass x-Werte nur Werte innerhalb dieser Schleife anzutreffen sind, kann ich sie doch auch in einem array abspeichern, denn jedes y,z u. w bezieht sich auf denselben Wert x. Daher duerfte meiner Ansicht nach hueben wie drueben kein Unterschied in der Berechnung auftreten, auch wenn mein Bsp mit den Arrays komplizierter aussieht.
Zum Hintergrund:
Ich probiere gerade mit der Datenausgabe an Zieldateien herum. Derzeit ist meine Zieldatei eine -.txt Datei.
Es sollte auch moeglich sein die errechneten Werte in Form einer Matritze oder Tabelle (also wieder einem Array mit Zuordnung zum jew. x) abzuspeichern und dann auszugeben, sortiert nach Spalten und Zeilen.
Soweit bin ich aber noch nicht, heute wird das auch nichts mehr...  |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 05.06.2012, 21:44 Titel: |
|
|
Zunächst einmal legst du die Unter- und Obergrenze des Arrays bereits in der ersten Zeile fest (DIM), und zwar Untergrenze 0 und Obergrenze x (=0). Dass du später xmin und xmax eingeben lässt, verändert diese bereits festgelegten Grenzen nicht. Wenn du das so machen willst, darfst du das Array erst danach dimensionieren:
Code: | input "Untergrenze; ", xmin
input "Obergrenze; ", xmax
DIM AS SINGLE y(xmin TO xmax) |
Das wird aber trotzdem nicht funktionieren, weil die Indizes eines Arrays immer INTEGER-Werte sind. Ein y(1.5) wird zuerst einmal zu einem y(2) gerundet, d. h. x=1.5 und x=2.0 greifen auf dasselbe y(2) zu. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
FreeBASIC_Jockey
Anmeldungsdatum: 26.05.2012 Beiträge: 5
|
Verfasst am: 08.06.2012, 18:08 Titel: |
|
|
Hallo,
Ich habe es jetzt anders geloest und zwar ganz ohne arrays und Zaehlschleife.
Code: | 'PROGRAMMABSCHNITT 1:
'**************************************
dim as single x, y, z, w, xmin, xmax
dim as Integer p, i
dim Zeile As String, DNr As Integer = FREEFILE
'legt an\oeffnet die Testdatei Werte.txt auf dem Desktop
OPEN "Werte.txt" FOR OUTPUT AS #1
'Definiert die Ober- und Untergrenze des X-Wertebereichs
wertebereich:
cls
input "Untergrenze; ", xmin
input "Obergrenze; ", xmax
if xmin>xmax then
print "Fuer den Wertebereich gilt xmin < xmax; bitte Wertebereich anpassen und mit einer Taste bestaetigen."
sleep
goto Wertebereich
end if
'PROGRAMMABSCHNITT 2:
'**************************************
'Druckt die Spaltenbeschriftungen in das Ausgabedokument
print #1, " x " &"; ",
print #1, " (x+1)*(x+1) " &";",
print #1, " (x-1)*(x-1) " &";",
print #1, " (x+1)*(x-1) " &";"
'Ab hier fuehrt die Rechenschleife aus und druckt die Ergebnisse in das Ausgabedokument
x=xmin 'legt den Startwert bei xmin fest
do
x=x+0.01
y=(x+1)*(x+1) 'Berechnung erste binomische Formel
z=(x-1)*(x-1) 'Berechnung zweite binomische Formel
w=(x-1)*(x+1) 'Berechnung dritte binomische Formel
print #1, x &";",
print #1, y &";",
print #1, z &";",
print #1, w
p=(x - xmin)/(xmax - xmin)*100 'innerhalb der Rechenschleife wird der
'Rechenfortschritt berechnet u in '%' ausgegeben;
print "Fortschritt: ", p &"%" 'Ausgabe des Bearbeitungsfortschritts in '%'
sleep 10
cls
loop until x>xmax 'wiederholt die Schleife so lange bis x oberhalb des
'Wertebereichs liegt
CLOSE #1 'Die Bearbeitung der Datei "Werte.txt" ist beendet und sie wird
'geschlossen
print "Fortschritt: " &p &"%"
'PROGRAMMABSCHNITT 3:
'**************************************
'Hier habe ich statistische Auswertungen und Informationen angehaengt, die mit
'dem eigtl. Berechnen der binom. Formeln nichts zu tun haben
'Oeffnet die erstellte Datei "Werte.txt"
OPEN "Werte.txt" FOR INPUT AS #DNr
i=0 'setzt den Parameter i auf Null
'Es werden die in "Werte.txt" abgelegten Zeilen gezaehlt...
do until eof(1)
LINE INPUT #DNr, Zeile
i=i+1
loop
'...und ausgegeben
PRINT "Anzahl der nach 'Werte.txt' geschriebenen Zeilen: ", i-1
CLOSE #DNr
sleep |
Zwar wollte ich unbedingt arrays einbinden, das klappt auch wenn ich i als Index und als Schleife for i = 1 to n verwende und dann mit 'if x(i)= xmax exit for' die Schleife verlasse. Problem ist, dass dann aber nur bis x(4) gerechnet wird und danach ohne Grund ein Abbruch erfolgt. Der Grund dafuer bleibt mir weiterhin verborgen...
Hin wie her, ich hoffe dass die Kommentare selbsterklaerend sind und denke ich habe akzeptabel kommentiert. Weil ich mich doch einige Zeit damit beschaeftigt habe, habe ich mich entschlossen ihn hier zu posten.
Da ich mir kuerzlich den FBEdit-IDE gezogen habe (grandios!) will ich mich nun verstaerkt mit der Einbindung von Objekten beschaeftigen u wuerde mich freuen wenn jm. einen Tip f. ein FB-Tutorial o. Handbuch weiss. Ist zwar beim FBEdit was dabei, aber besser mehr ist besser...
So long, sunny greez ! |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 08.06.2012, 20:04 Titel: |
|
|
Warum x(i) = xmax und nicht i = xmax?
Mal ein Versuch mit Arrays:
Code: | function f(x as single) as single
return x^2 - 1
end function
dim as integer xmin, xmax, schritte
input "Berechnung von ", xmin
input "Berechnung bis ", xmax
input "Schritte pro Einheit: ", schritte
dim as single y(xmin*schritte to xmax*schritte)
for i as integer = xmin*schritte to xmax*schritte
dim as single x = i/schritte
y(i) = f(x)
print "f(" & x & ") = " & y(i)
next
getkey |
Du musst hier halt doppelt fahren, weil es wie gesagt nur Integer-Indizes gibt.
Tutorials findest du eine ganze Menge im FreeBASIC-Portal. Was suchst du denn genau? Verwendung von #INCLUDE oder was meinst du? _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|