python+gnuplot의 만델브로 집합 (둘)

13622 단어 gnuplotPython
지난번 이후.
만델브로를 만델브로 집합을 생성하는 클래스로 정의하고 만델브로 집합을columns_save(s 함수와 같이 사용하기 위해 PyGnuplot 모듈과 결합하여 gp.colss로 사용) 중 tmp.gnuplot으로 그리기 위해dat로 출력합니다.
지난번부터 시작된 변경점은 주로 Mandelbrot류의 x축, y축의 변경점을 생성하고arange방법에서 linspac방법으로 전환하여 Gnuplot와 같은 샘플수의 변경점으로 삼아sample, isosample 변수로 분할한다.
mandelbrot_set 속성에서 호출하기로 결정했습니다.또 만델브로 집합이 생성되면 재계산을 하지 않고 생성된 집합으로 되돌아와 계산량을 줄인다.
gnuplot 방면의 방법으로 "setpm3dmap"으로 점차적으로 등고선을 출력할 수 있습니다. (시행 오류가 나면 됩니다. 지난번에 왜 못했는지 모르겠습니다.)
묘사된 구역으로서 참조여기는 구역을 설정했다.(단, 링크 대상과 같은 이미지는 나타나지 않습니다.)
mandelbrot.py
#!/usr/bin/env python
import numpy as np

def columns_save(data, filename='tmp.dat'):
    '''
    saves numbers arrays and text into filename (default = 'tmp.dat)
    (assumes equal sizes and 2D data sets)
    >>> s(data, filename='tmp.dat')  # overwrites/creates tmp.dat
    '''
    file = open(filename, 'w')
    columns = len(data)
    rows = len(data[0])
    for i in range(columns):
        if data[i] == []:
            file.write('\n')
            continue
        for j in range(rows):
            file.write(str(data[i][j]))
            file.write(' ')
        file.write('\n')
        if i % 1000 == 0 :
            file.flush()  # write once after every 1000 entries
    file.close()  # write the rest

import PyGnuplot as gp
gp.colss = columns_save

class Mandelbrot:

    scale       = 0.003
    sample      = 1000
    isosample   = 1000
    cnter=complex(-0.743,0.1145)
    def __init__(self):
        self._xbase = np.linspace(-self.scale,self.scale,self.sample)
        self._ybase = np.linspace(-self.scale,self.scale,self.isosample)
        self._cbases = []
        self._mset = []

    def __gen_cbases(self):
        if self._cbases != []: return
        for x in self._xbase:
            self._cbases.append([])
            for y in self._ybase:
                self._cbases[-1].append(complex(x,y)+self.cnter)
        return

    def mandelbrot(self,c):
        z = 0j
        for n in range(1,200):
            z = z**2 + c
            if np.abs(z) > 2.0:
                print(np.log(n))
                return np.log(n)
        return 0

    def gen_mandelbrot(self):
        if self._mset != []: return
        self.__gen_cbases()
        for cs in self._cbases:
            for c in cs:
                self._mset.append([c.real, c.imag, self.mandelbrot(c)])
            self._mset.append([])
        return

    def reset(self):
        self._cbases = []
        self._mset = []
        return

    @property
    def mandelbrot_set(self):
        if self._mset == []:
            self.gen_mandelbrot()
        return self._mset

if __name__ == "__main__":
    m = Mandelbrot()
    print("calc")
    gp.colss(m.mandelbrot_set)
    gp.c("""
        set term png size 900,900
        set output "m2.png"
        set size square;
        set grid
        set pm3d map
#        set nosurface
#        set contour base
#        set view map
        """)
    gp.c('splot "tmp.dat" using 1:2:3')

생성된 이미지



도전하다


만델브로가 집합한 특징 도형은 나오지 않았다.

좋은 웹페이지 즐겨찾기