 |
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 |
psygate
Anmeldungsdatum: 05.04.2005 Beiträge: 304 Wohnort: Wien und der Computer
|
Verfasst am: 06.11.2006, 17:19 Titel: Newton Fraktal |
|
|
Abend! Ich habe schon weider ein problem....
ich suche seit Tagen nach Sources in basic die ein newton-Fraktal berechnen. Ich bin selbst bis jetzt nciht fähig gewesen es selbst zu schreiben, da mir erstens die Zeit fehlt und zweitens das Hirnschmalz da ich im moment einfach zu beschäftigt bin um genauer darüber nach zu denken.
hat vielleicht einer von euch einen Source für mich?
BITTE BITTE BITTE? _________________ Danke an Volta für seine großartige MMX_fade function. *verneig*
Personal-DNA:
<script src="http://personaldna.com/h/?k=qtrCFboSuCOpFrX-OI-AADBA-f78d&t=Free-Wheeling+Leader">
</script>
Zitat: | Das Forum für den zum QBASIC kompatieblen open soure FreeBasic Kompiler. | by DJ. Peters |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 06.11.2006, 18:16 Titel: |
|
|
Quellcode habe ich keinen, aber
http://de.wikipedia.org/wiki/Newton-Fraktal
gibt dazu eine doch recht gute Erklärung. Wichtig: Sind halt alles Operationen mit komplexen Zahlen! Ansonsten hatte ich früher auch viel mit Apfelmännchen, Mandelbrot, Juliamenge & Co herumexperimentiert und die dortigen Programme unter
http://www.dreael.ch/Deutsch/Download/Apfelmaennchen.html
als Download zur Verfügung gestellt. Hinweis: Der QB-Code dürfte wahrscheinlich 1:1 auch in FreeBasic lauffähig sein. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
croco97

Anmeldungsdatum: 04.11.2005 Beiträge: 260
|
|
Nach oben |
|
 |
psygate
Anmeldungsdatum: 05.04.2005 Beiträge: 304 Wohnort: Wien und der Computer
|
Verfasst am: 11.11.2006, 13:06 Titel: |
|
|
Also.... Ich habs bis ejtzt ned geschafft. Alles vergeblich.... Hat wirklich keiner einen ordentlichen Source der ein NEWTON FRAKTAL berechnet? _________________ Danke an Volta für seine großartige MMX_fade function. *verneig*
Personal-DNA:
<script src="http://personaldna.com/h/?k=qtrCFboSuCOpFrX-OI-AADBA-f78d&t=Free-Wheeling+Leader">
</script>
Zitat: | Das Forum für den zum QBASIC kompatieblen open soure FreeBasic Kompiler. | by DJ. Peters |
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 11.11.2006, 19:17 Titel: |
|
|
Hi psygate,
..aber natürlich gibt es Quell-Code für das Newton-Fraktal:
http://www.hyper-world.de/programme/fractalviewer.html
..nur dummerweise nicht in FreeBASIC
Ich hab mir den Quell-Code mal gezogen, aber leider verstehe ich zuwenig C++, um das zu verstehen..
Der Quell-Code für das Newton Fraktal steht in ..\inc\Fraktal.h oder so ähnlich..
..frag mich bitte nicht, wieso der so entsetzlich viele Variablen übergibt, die er nicht benutzt und wie das mit den C-Pointern funktioniert
btw:
Vorsicht: Er schreibt 'Systemvorraussetzungen'
Gruß
ytwinky _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 11.11.2006, 23:10 Titel: |
|
|
Regenwetter und einmal nicht im Geschäft sein Dank - habe kurz ein kleines Newton-Fraktal selber programmiert. Ist in QBasic V1.1 entstanden, dürfte aber vermutlich in FreeBasic 1:1 oder mit nur ganz geringen Anpassungen lauffähig sein. Download:
http://beilagen.dreael.ch/QB/NEWTONFR.BAS
Einige Hintergrundinformationen dazu: Dem einen oder anderen dürfte das Newton-Verfahren bekannt sein, um Gleichungen rein numerisch lösen zu können.
Normalerweise setzt man den Startwert in der Lösungsnähe an, so dass der Rechner schnell zur gesuchten Lösung kommt, z.B. im CAD-Programm den Schnittpunkt zweier Splines berechnet. Wenn man den Startpunkt ungünstig wählt und die Funktion besitzt mehrere Nullstellen, dann ist es gewissermassen dem Zufall überlassen, welche Nullstelle als Lösung berechnet wird.
Erweitert man den Zahlenraum auf komplexe Zahlen, so dass es eine Ebene von möglichen Startwerten gibt, wählt man ausserdem die Funktion als Polynom eines beliebigen Grades und registriert systematisch mit verschiedenen Farben die Lösungen (Nullstellen!) auf der Ebene, zu welchen das Newton-Verfahren konvergiert, so erhält man die bekannten Fraktale, welche übrigens immer entsprechend dem Polynom-Grad n-Länderecken darstellen, wenn man die Nullstellen beim Polynom als reguläres Vieleck auf der komplexen Ebene anordnet. Das wäre, wie wenn man Deutschland, Österreich und die Schweiz noch so in Enklaven zerlegen würde, dass es nirgends einen Punkt mehr gibt, an welchem nur zwei Länder angrenzen, d.h. gesamte Landesgrenze besteht nur aus 3-Länderecken.
Ich gebe sonst hier einen Satz Beispielwerte zum Ausprobieren an, welche auch ein optisch ansprechendes Ergebnis liefern:
Eingaben hat Folgendes geschrieben: | C:\BASICPRG\QBASIC\FORUM>qbasic /run newtonfr
Eingabe Parameter: Nullstellen des Polynoms
Anzahl Nullstellen? 4
1 . Nullstelle (Format Real,Imaginär)? 1,0.6
2 . Nullstelle (Format Real,Imaginär)? -0.5,1.1
3 . Nullstelle (Format Real,Imaginär)? -1,-0.4
4 . Nullstelle (Format Real,Imaginär)? 0.5,-0.9
Grenze, wo die Nullstelle als erreicht gilt? 0.01
Ausschrittbetrag (Grenze, falls das Newton-Verfahren divergiert)? 50000
Maximale Iterationstiefe? 100
Eingabe Ausschnitt aus der Gauss'schen Ebene
Real min? -2
Imaginär min? -1.5
Imaginär max? 1.501 |
Hinweise zum Programm selber: Es wurde nicht auf Geschwindigkeit, sondern auf Lesbarkeit hin optimiert. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 12.11.2006, 12:46 Titel: |
|
|
Hi dreael,
es ist einfach oberaffen..stark.
Jetzt kann ich auch den Wiki-Artikel verstehen(u.a.)
[Edit]
..beim Spielen mit dem Newton-Fraktal fiel mir auf: dreael hat Folgendes geschrieben: | WHILE ziel% = -1 AND aIt% < itMax% AND z.r * r.r + z.i * z.i < diverg2! | r.r ist auch deklariert, erhält aber nie einen Wert..
richtig scheint hier z.r zu sein
..wie gesagt, in meiner SpielVersion: Code: | ' Newton-Fraktal
'von A.Meile aka dreael
'bearbeitet von ytwinky
#define Real Single
Option Explicit
Type Komplex
r As Real
i As Real
End Type
Declare Function Betrag(byVal z1 As Komplex, byVal z2 As Komplex) As Real
Const DateiName="Newton_Fraktal.Koo"
Dim As Komplex t, z, fx, fdiffx, nx, q
Dim As Long MaxScreenX, MaxScreenY, AnzNullSt, i, j, itMax, y, x, ait, Ziel, DNr=FreeFile
Dim As Real Toleranz, Divergenz, xMin, yMin, yMax, Schranke, yt
nx.r=0.0
nx.i=0.0
Screen 19
ScreenInfo MaxScreenX, MaxScreenY
'?"Eingabe Parameter: Nullstellen des Polynoms"
'Input "Anzahl Nullstellen"; AnzNullSt
AnzNullSt=4
Dim As Komplex Nullst(0 To AnzNullSt-1), Poly(0 To AnzNullSt), Poly1Diff(0 To AnzNullSt-1)
For i=0 To AnzNullSt ' Polynom initialisieren
Poly(i)=nx
Next i
Poly(0).r = 1.0 'bloß nicht vergessen
For i=0 To AnzNullSt-1
' ? i;
' Input". Nullstelle (Format Real,Imagin„r)"; Nullst(i-1).r, Nullst(i-1).i
Read Nullst(i).r, Nullst(i).i
For j=i+1 To 1 Step -1 ' Polynom-Koeffizienten bilden (Faltungsprozess)
Poly(j).r+=Poly(j-1).r
Poly(j).i+=Poly(j-1).i
q.r=Poly(j-1).r*-Nullst(i).r-Poly(j-1).i*-Nullst(i).i
q.i=Poly(j-1).r*-Nullst(i).i+Poly(j-1).i*-Nullst(i).r
Poly(j-1)=q
Next j
Next i
'Input "Grenze, an der die Nullstelle als erreicht gilt"; Toleranz
Toleranz=0.01
'Input "Ausschrittbetrag (Grenze, falls das Newton-Verfahren divergiert)"; Divergenz
Divergenz=50000
'Input "Maximale Iterationstiefe"; itMax
itMax=100
' 1.Ableitung bilden
t.i=0.0
For i=1 To AnzNullSt
t.r=i
' Aufmultiplizieren Poly1Diff(i-1), t
Poly1Diff(i-1).r=Poly(i).r*t.r-Poly(i).i*t.i
Poly1Diff(i-1).i=Poly(i).r*t.i+Poly(i).i*t.r
Next i
'?"Eingabe Ausschnitt aus der Gauss'schen Ebene"
'Input "Real min"; xmin
xmin=-2
'Input "Imagin„r min"; ymin
ymin=-1.5
'Input "Imagin„r max"; ymax
ymax=1.501
' xmax kann aufgrund der Bildschirmproportionen berechnet werden
' denn wir wollen kein verzerrtes Fraktal
WindowTitle "Newton-Freaktal: Real max=" &(xMin+(yMax-yMin)/0.75)
' Ab hier Berechnung
Schranke=(yMax-yMin)/MaxScreenY
Toleranz*=Toleranz
Divergenz*=Divergenz
Open DateiName For Output As #Dnr
Palette 0, RGB(63, 63, 63)
?#DNr, 0, RGB(63, 63, 63)
For i=1 To 3
j=63-5*i
Palette i, RGB(0, j, 0)
?#DNr, i, RGB(0, j, 0)
Palette i+3, RGB(0, 0, j)
?#DNr, i+3, RGB(0, 0, j)
Palette i+6, RGB(j, 0, 0)
?#DNr, i+6, RGB(j, 0, 0)
Palette i+9, RGB(0, j, j)
?#DNr, i+9, RGB(0, j, j)
Palette i+12, RGB(0, j, j)
?#DNr, i+12, RGB(0, j, j)
Next i
For y=0 To MaxScreenY-1
For x=0 To MaxScreenX-1
z.r=xmin+x*Schranke ' Startwert vom Newton-Verfahren, an dem wir beginnen wollen
z.i=ymax-y*Schranke
aIt=0
Ziel=-1
Do
For i=0 To AnzNullSt-1 ' Ziel erreicht pr?fen
If Betrag(z, Nullst(i))<Toleranz Then
Ziel=i
End If
Next i
If Ziel-1 Then
fx=nx
For i=AnzNullSt To 0 Step -1 ' Wert f(z) berechnen (Polynom)
t.r=fx.r*z.r-fx.i*z.i+Poly(i).r
t.i=fx.r*z.i+fx.i*z.r+Poly(i).i
fx=t
Next i
fdiffx=nx
For i=AnzNullSt-1 To 0 Step -1 ' Wert f'(z) berechnen (Polynom)
t.r=fdiffx.r*z.r-fdiffx.i*z.i+Poly1Diff(i).r
t.i=fdiffx.r*z.i+fdiffx.i*z.r+Poly1Diff(i).i
fdiffx=t
Next i
yt=fdiffx.r*fdiffx.r+fdiffx.i*fdiffx.i ' Wert z(n+)=z(n)-f(z(n))/f'(z(n)) berechnen
z.r+=-(fx.r*fdiffx.r+fx.i*fdiffx.i)/yt
z.i+=(fx.r*fdiffx.i-fx.i*fdiffx.r)/yt
aIt+=1
End If
Loop Until Not(Ziel=-1 And aIt<itMax And z.r*z.r+z.i*z.i<Divergenz)
PSet (x, y), IIF(Ziel=-1, 0, 3*(Ziel Mod 5)+aIt Mod 3+1)
?#DNr, Str(x) &"$" &y &"%" &IIF(Ziel=-1, 0, 3*(Ziel Mod 5)+aIt Mod 3+1)
Next x
Next y
Close DNr
Sleep
Screen 0
Function Betrag(byVal c1 As Komplex, byVal c2 As Komplex) As Real
Dim As Real DeltaR=c2.r-c1.r, DeltaI=c2.i-c1.i
Return DeltaR*DeltaR+DeltaI*DeltaI
End Function
Data 1, 0.6, -0.5, 1.1, -1, -0.4, 0.5,-0.9 | ..habe ich nur die Standardvorgaben von dreael drin.
Ich wollte die Geschwindigkeitsunterschiede bei anderen Auflösungen testen(u.a.)
[Edit]
Code geändert, damit ich auch speichern kann..
..einlesen kann ich jetzt auch..
..und jetzt dreh' ichs, aber das kann dauern..
Gruß
ytwinky _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO..
Zuletzt bearbeitet von ytwinky am 12.11.2006, 17:55, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 12.11.2006, 15:16 Titel: |
|
|
ytwinky hat Folgendes geschrieben: | ..beim Spielen mit dem Newton-Fraktal fiel mir auf: dreael hat Folgendes geschrieben: | WHILE ziel% = -1 AND aIt% < itMax% AND z.r * r.r + z.i * z.i < diverg2! | r.r ist auch deklariert, erhält aber nie einen Wert.. |
Danke für den Hinweis. Bereits korrigiert. Sollte natürlich z.r*z.r+z.i*z.i sein (Betrag prüfen, ob der Wert ins Unendliche divergiert)... _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 13.11.2006, 19:24 Titel: |
|
|
Hi,
das Drehen der Grafik dauert erwartungsgemäß länger als das reine Laden(~3sec).
Außerdem funktioniert es nicht so einfach, wie ich es mir dachte
Wer damit spielen möchte: Code: | 'Newton-Fraktal [gedreht] anzeigen
'von ytwinky
#define Real Single
Option Explicit
Const DateiName="Newton_Fraktal.Koo", alpha=0 '-0.3054326190990 '-17.5
Dim As Long i, j, c, y, x, y1, x1, y0=-150, x0=150, k, DNr=FreeFile
Dim As String s, a, e
Dim As Double Start, Ende
WindowTitle "Newton-FreaktalShow"
Screen 19
a=Time
Start=Timer
Open DateiName For Input As #Dnr
Input #DNr, i, c
Palette i, c
For i=1 To 3
Input #DNr, j, c
Palette j, c
Input #DNr, j, c
Palette j, c
Input #DNr, j, c
Palette j, c
Input #DNr, j, c
Palette j, c
Input #DNr, j, c
Palette j, c
Next i
Do While Not Eof(DNr)
Input #Dnr, s
k+=1
i=Instr(s, "$")
j=Instr(s, "%")
x=Val(Left(s, i-1))
y=Val(Mid(s, i+1, j-1-i))
If alpha<>0 Then
x1=(x-x0)*cos(alpha)-(y-y0)*sin(alpha)
y1=(x-x0)*sin(alpha)+(y-y0)*cos(alpha)
x=x1
y=y1
End If
c=Val(Mid(s, j+1))
PSet (x, y), c
Loop
Close DNr
Ende=Timer
e=Time
'Screen 0
'?"Start=" &a
'?"Zeit="&(Ende-Start)
'?"Ende=" &e
Sleep |
Gruß
ytwinky _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
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.
|
|