これは、ニュートン法を使用してフラクタルを作成するために私が書いた小さなスクリプトです。
import numpy as np
import matplotlib.pyplot as plt
f = np.poly1d([1,0,0,-1]) # x^3 - 1
fp = np.polyder(f)
def newton(i, guess):
if abs(f(guess)) > .00001:
return newton(i+1, guess - f(guess)/fp(guess))
else:
return i
pic = []
for y in np.linspace(-10,10, 1000):
pic.append( [newton(0,x+y*1j) for x in np.linspace(-10,10,1000)] )
plt.imshow(pic)
plt.show()
私は numpy 配列を使用していますが、それでも 1000 行 1000 列の linspace の各要素をループして、newton()
配列全体ではなく単一の推測に作用する関数を適用します。
私の質問は次のとおりです。numpy 配列の利点をより有効に活用するために、アプローチをどのように変更できますか?
PS: あまり長く待たずにコードを試してみたい場合は、100 x 100 を使用することをお勧めします。
余分な背景:
多項式のゼロを見つけるためのニュートンの方法を参照してください。
フラクタルの基本的な考え方は、複素平面で推測をテストし、ゼロに収束するまでの反復回数を数えることです。それが の再帰でnewton()
あり、最終的にステップ数を返します。複素平面の推定値は、画像内のピクセルを表し、収束までのステップ数で色分けされています。シンプルなアルゴリズムから、これらの美しいフラクタルが得られます。