  | 
					
						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, 16: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: 2531 Wohnort: Hofen SH (Schweiz)
  | 
		
			
				 Verfasst am: 06.11.2006, 17: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, 12: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, 18: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: 2531 Wohnort: Hofen SH (Schweiz)
  | 
		
			
				 Verfasst am: 11.11.2006, 22: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, 11: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, 16:55, insgesamt einmal bearbeitet | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		dreael Administrator
  
  Anmeldungsdatum: 10.09.2004 Beiträge: 2531 Wohnort: Hofen SH (Schweiz)
  | 
		
			
				 Verfasst am: 12.11.2006, 14: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, 18: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.
  | 
   
 
     |