fractalnewton.py

Created by cpaulof

Created on April 27, 2026

3.11 KB

Fractais de Newton Versão 2026.04.27 f(z)=z^5 -1


#######################################################
# Fractais de Newton
# v. 2026.04.27
##############################################################
#
#  Carlos Paulo A. Freitas (cpaulofonline@gmail.com)
#  https://zonaexacta.blogspot.com
#  https://sites.google.com/view/cpaulof-prog-calc
#
#######################################################
import kandinsky,math
LARGURA = 320
ALTURA = 222
# Area a percorrer
X_MIN = -2.0
X_MAX = 2.0
deltaX=(X_MAX-X_MIN)/(LARGURA-1)
Y_MIN =-ALTURA/2*(X_MAX-X_MIN)/LARGURA
Y_MAX = ALTURA/2*(X_MAX-X_MIN)/LARGURA
deltaY=(Y_MAX-Y_MIN)/(ALTURA-1)
M = 45 # maximo de iteracoes
E = 1E-14# E (epsilon)= margem de erro ...vou usar a mesma para tudo

#Cores: vou deixar 9 cores
F=255
cores = [
 [0,0,0], #0 preto
 [F,F,F], #1 branco
 [F,0,0], #2 vermelho
 [0,F,0], #3 verde
 [0,0,F], #4 azul
 [F,0,F], #5 violeta
 [F,F,0], #6 vermelho+verde=
 [0,F,F], #7
 [204,153,0] #8
]
N_COLORS=9
# Funcao complexa
def f(z):
    return z*z*z*z*z-1
    
# Derivada
def df(z):
    return 5*z*z*z*z
    
def FractalNewton():
  # desenhar o fractal
  nzeros=0 #numero de zeros que ja apareceram
  zero=[]  #lista dos zeros que ja apareceram
  zero_=-1 #posicao do zero actual na lista
  for k in range(LARGURA):
     C=0 #nivel de escuridao
     x = X_MIN + k*deltaX
     oldx = x - deltaX
     for l in range(ALTURA):
          y = Y_MIN+(ALTURA-l)*deltaY
          z = complex(x, y)
          oldz = complex(oldx, y+deltaY)
          m=0
          print("(",k,",",l,"), nzeros=",nzeros)
          while(m<M and (abs(z-oldz))>=E):
            oldz=z
            z = z - f(z) / df(z) # Formula recursiva do metodo de Newton
            if (abs(z-oldz) < E):    # Testar se z ja a variar pouco
                if nzeros==0:
                    zero_=0
                    zero.append(z)
                    nzeros = nzeros + 1
                    print("Numero de zeros=",nzeros,":",z)
                else: 
                    estanalista=False
                    for j in range(nzeros):
                        estanalista=(abs(z-zero[j])<1E-7)
                        if estanalista:
                            zero_=j
                            break
                    if( not estanalista ):
                        zero.append(z)
                        zero_=nzeros
                        nzeros = nzeros + 1
                        print("Numero de zeros=",nzeros,":",z)
                        break
                cor=zero_
                if (zero_==0):
                  cor=6 #amarelo
                elif zero_==1:
                  cor=4 #azul
                elif zero_==2:
                  cor=2 #vermelho
                elif zero_==4:
                  cor=5
                                      
                C=m/(M+0.0);C=1-math.sin(C*math.pi/2);
                col = kandinsky.color(int(C*cores[cor][0]),int(C*cores[cor][1]),int(C*cores[cor][2]))
                kandinsky.set_pixel(k, l, col)                
            else:
              col = kandinsky.color(cores[0][0],cores[0][1],cores[0][2])
              kandinsky.set_pixel(k, l, col)                
            m=m+1

FractalNewton()
      

During your visit to our site, NumWorks needs to install "cookies" or use other technologies to collect data about you in order to:

With the exception of Cookies essential to the operation of the site, NumWorks leaves you the choice: you can accept Cookies for audience measurement by clicking on the "Accept and continue" button, or refuse these Cookies by clicking on the "Continue without accepting" button or by continuing your browsing. You can update your choice at any time by clicking on the link "Manage my cookies" at the bottom of the page. For more information, please consult our cookies policy.