Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

FunktionsWerte ueber FB-Funktion an *.txt file ausgeben

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
FreeBASIC_Jockey



Anmeldungsdatum: 26.05.2012
Beiträge: 5

BeitragVerfasst am: 26.05.2012, 22:13    Titel: FunktionsWerte ueber FB-Funktion an *.txt file ausgeben Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
HorstD



Anmeldungsdatum: 01.11.2007
Beiträge: 110

BeitragVerfasst am: 26.05.2012, 22:37    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 27.05.2012, 00:02    Titel: Antworten mit Zitat

Ein Beispiel zum Plotten findest du hier:
http://www.freebasic-portal.de/befehlsreferenz/window-136.html

Code:
x=f(X)

hmm - ich hätte ja y = f(x) genommen ...
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 27.05.2012, 02:29    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
FreeBASIC_Jockey



Anmeldungsdatum: 26.05.2012
Beiträge: 5

BeitragVerfasst am: 27.05.2012, 18:05    Titel: Antworten mit Zitat

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. lächeln
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... happy


Gruesse,
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
FreeBASIC_Jockey



Anmeldungsdatum: 26.05.2012
Beiträge: 5

BeitragVerfasst am: 05.06.2012, 18:49    Titel: Antworten mit Zitat

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)traurigx+1)*(x+1) , 1. binom Formel
2. y(x)traurigx+1)*(x-1) , 2. binom Formel
3. y(x)traurigx-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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 05.06.2012, 18:57    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
FreeBASIC_Jockey



Anmeldungsdatum: 26.05.2012
Beiträge: 5

BeitragVerfasst am: 05.06.2012, 21:13    Titel: Antworten mit Zitat

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... Zunge rausstrecken
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 05.06.2012, 21:44    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
FreeBASIC_Jockey



Anmeldungsdatum: 26.05.2012
Beiträge: 5

BeitragVerfasst am: 08.06.2012, 18:08    Titel: Antworten mit Zitat

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... mit den Augen rollen

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... grinsen

So long, sunny greez cool !
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 08.06.2012, 20:04    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz