HSV投影中的顏色空間
假設我們想要視覺化一個復值函式,比如
f : C → C z ↦ w = f ( z ) {\displaystyle {\begin{aligned}f:\mathbb {C} &\;\to \mathbb {C} \\z&\;\mapsto w=f(z)\\\end{aligned}}}
為了給 w {\displaystyle w} 著色,我們將其分解為其絕對值 | w | {\displaystyle |w|} 和其輻角 arg ( w ) {\displaystyle \arg(w)} .
然後,我們將顏色
H S V ( 1 2 π arg ( w ) , 1 − g a s , b s ( | w | ) , g a v , b v ( | w | ) ) {\displaystyle \mathrm {HSV} \left({\tfrac {1}{2\pi }}\arg(w),\;1-g_{a_{s},b_{s}}(|w|),\;g_{a_{v},b_{v}}(|w|)\right)}
分配給表示 z {\displaystyle z} 的點。在這個HSV顏色空間 中,所有值都在 0 到 1 之間。HSV 顏色的第一個分量(色調)僅取決於 w {\displaystyle w} 的輻角,而第二個和第三個分量(飽和度和明度)僅取決於 w {\displaystyle w} 的絕對值。我們在 w {\displaystyle w} 上使用變換 g a , b {\displaystyle g_{a,b}} 將其對映到區間 [ 0 , 1 ] {\displaystyle [0,1]} 。關於 g {\displaystyle g} ,參見章節輔助函式 .
索引為s (飽和度)的值控制飽和顏色向白色(或灰色)的過渡,即中間值 → 無限大。索引為h (值/色度)的值控制黑色嚮明亮的過渡,即零 → 非零。引數a 控制過渡發生的位置:a 只是劃分兩個區域(暗/亮、飽和/灰等)的圓的半徑。引數b 控制過渡的銳度:b 小 = 平滑,b 大 = 銳利。
以下影像均顯示範圍 [-10,10]×[-10,10] i {\displaystyle i} ,並使用 a s = 5 {\displaystyle a_{s}=5} (彩虹的半徑)和 a v = 1 {\displaystyle a_{v}=1} (黑色圓盤的半徑)。
在 S 和 V 的意義交換的影像中,零用白色列印,而無窮大用黑色列印。
分析 z→z²+c 的臨界點
n=1:起始值(顏色圖)
n=2
n=3
n=4
n=17
n=18
n=19
n=20
Julia 集 和 Fatou 集 可以很漂亮。它們的計算機圖形生成可能很困難。
在本頁的剩餘部分,我們將研究一種可用於視覺化複函式 ƒ 的 Julia 集的方法。它的優點是您不需要知道迭代的吸引子
z ↦ f ( z ) {\displaystyle z\mapsto f(z)}
生成的影像在 Fatou 部分將是平滑的。
請注意,還存在其他方法來對復動力系統進行著色,例如
計算 ƒ 的原像,即計算反向軌道。由於不動點的穩定性從吸引轉變為排斥,反之亦然,人們只需選擇一個複數,然後觀察它在逆迭代下的變化情況。問題是結果不會均勻分佈在 J {\displaystyle J} 中,而且您必須計算 ƒ 的逆。
從用於著色的點陣中取一個值,進行迭代,直到迭代值接近吸引子 。根據使點足夠接近吸引子所需的迭代次數對該點進行著色。
此方法通常用於視覺化多項式的 Julia 集和與牛頓著名方法 (用於查詢函式的零點)相連的 Julia 集。度數 > 1 的多項式總是具有無窮大作為超吸引不動點。牛頓方法中出現的理性函式總是具有函式的根作為吸引不動點。然而,在這兩種情況下,可能存在其他吸引子,而且這些吸引子不一定只包含一個點。
如果 ∞ 是一個吸引子,即過程的一個不動點,那麼根據迭代次數(時間)對點進行著色,直到看到點逃逸到 ∞。如果點在最大迭代次數內沒有逃逸,那麼該點被著色為屬於 Julia 集或某個其他吸引子的盆地。此方法適用於多項式。最突出的 Julia 集是z →z 2 +c 的 Julia 集,其中c 是 Mandelbrot 集的元素或距離 Mandelbrot 集不遠。如果您看到這樣的 Julia 集的影像,那麼很可能使用了 ETA 來獲得影像。
在本頁的剩餘部分,我將介紹一種不同的方法,其基本思想與逃逸時間演算法 相同。但是,不需要預先知道任何吸引盆地,並且可以將不同的吸引盆地分離並以不同的顏色著色。這種方法使用柯西收斂 的概念。這種方法不是觀察點的軌道,而是觀察兩個相鄰點z 和 z +ε 的距離在迭代這兩個值時的變化情況。如果差值趨於 0,則該點將走向吸引子。如果差值不接近 0,則該點靠近(或部分屬於)Julia 集。
令 ϱ {\displaystyle \varrho } 是 緊化 的 複平面 到 黎曼球面 S 2 上的典範投影。
ϱ : C ¯ = C ∪ { ∞ } → S 2 {\displaystyle \varrho :{\overline {\mathbb {C} }}=\mathbb {C} \cup \{\infty \}\rightarrow S_{2}}
這給了我們一個 度量 d : 作為複平面上兩點之間的距離,我們取他們在球面上的距離,即 正形線 的長度。這意味著度量以 π 為界,即使到 ∞(現在是北極)的距離也是有限的。
為了計算兩點 z 和 w 之間的距離,我們以這樣的方式旋轉球體 S 2 ,使得
w 對映到 0
z 對映到正實軸
經過這些變換後,距離就可以很容易地計算出來。旋轉可以透過一系列 等距 的 莫比烏斯變換 來完成。總之,我們得到
t w : z ↦ { | z | , if w = 0 1 | z | , if w = ∞ 1 | w | , if z = ∞ 1 | w | ⋅ | z w ¯ − | w | 2 z w ¯ + 1 | , else {\displaystyle t_{w}:z\mapsto {\begin{cases}|z|\;,&{\text{ if }}w=0\\{\textstyle {\frac {1}{|z|}}}\;,&{\text{ if }}w=\infty \\{\textstyle {\frac {1}{|w|}}}\;,&{\text{ if }}z=\infty \\&\\{\textstyle {\frac {1}{|w|}}}\cdot \left|{\frac {z{\overline {w}}-|w|^{2}}{z{\overline {w}}+1}}\right|\;,&{\text{ else}}\end{cases}}}
留給讀者作為練習。橫線表示 複共軛 。度量為
d ( z , w ) = 2 arctan ( t w ( z ) ) {\displaystyle d(z,w)=\,\!2\arctan(t_{w}(z))}
d 引入的一個很好的特性是,以前在無窮遠處發散的序列現在收斂到無窮遠處,即收斂到 S 2 的北極。
回顧 Julia 集 的定義,該集合針對 壓縮對映 ƒ。該定義暗示了迭代的穩定性的一些事實
z ↦ f ( z ) ↦ f 2 ( z ) ↦ f 3 ( z ) ↦ ⋯ {\displaystyle z\mapsto f(z)\mapsto f^{2}(z)\mapsto f^{3}(z)\mapsto \cdots }
其中 ƒn 表示 ƒ 的第 n 次迭代
f n = f ∘ f ∘ ⋯ ∘ f {\displaystyle f^{\,n}=f\circ f\circ \cdots \circ f}
集合
{ f n ( z ) } n ∈ N 0 {\displaystyle \{f^{\,n}(z)\}_{n\in \mathbb {N} _{0}}}
稱為z 的軌道 (在 ƒ 下)。
如果z 和w 彼此靠近,並且屬於Fatou 集 F ƒ ,即 ƒ 的 Julia 集 J ƒ 的補集 ,則兩個點z 和w 的軌道在某種意義上表現相似。如果z 是J ƒ 的元素,則z 和w 將表現出相當不同的行為,即使w 本身是J ƒ 的元素。
為了獲得軌道穩定性的概念,我們設定
Σ n ( z ) = Σ n ( z , ε ) = ∑ k ⩽ n d ( f k ( z ) , f k ( z + ε ) ) {\displaystyle \Sigma _{n}(z)=\Sigma _{n}(z,\varepsilon )=\sum _{k\leqslant n}d\,(f^{k}(z),f^{k}(z+\varepsilon ))}
對於一個小 ε,以及上面的度量d 。這意味著我們取兩個彼此靠近的點,然後我們總結它們的距離,因為 ƒ 使它們在黎曼球面上跳躍。請注意,對於任何固定的 ε,即使z 是 Fatou 點,當n 很大時,該和也會發散。
但是,我們可以使用 Σn 來衡量一個點離J ƒ 有多近:該和越大,迭代越不穩定,該點離 ƒ 的 Julia 集越近。
為了區分 Julia 集(或接近 Julia 集的點)的點和 Fatou 集中的點,我們需要一個標準。為了獲得這個標準,我們計算我們要著色的點的所有 Σ 值,即格點 Γ 中的所有點。計算完這些值後,我們進行一些統計,以獲得期望值 E 和標準差 σ 用於 Σ 值集:令
E n = E n ( Γ , ε ) = E { log ( δ + Σ n ( z , ε ) ) } z ∈ Γ σ n = D n {\displaystyle {\begin{aligned}E_{n}&=E_{n}(\Gamma ,\varepsilon )=E\left\{\log(\delta +\Sigma _{n}(z,\varepsilon ))\right\}_{\!z\,\in \,\Gamma }\\\sigma _{n}&={\sqrt {D_{n}}}\\\end{aligned}}}
提醒一下
E X = 1 | X | ∑ x ∈ X x D X = E X 2 − ( E X ) 2 {\displaystyle {\begin{aligned}EX&={\textstyle {\frac {1}{|X|}}}\sum \limits _{x\in X}x\\D\!X&=EX^{2}-(EX)^{2}\\\end{aligned}}}
事實證明,Σ 值廣泛分佈在多個尺度上。因此,我們不直接使用 Σ。相反,我們使用 Σ 的對數 。δ 值只是一個小的常數,以避免對數的輸入為零。
現在,我們擁有了為一個點著色所需的一切
選擇一個點格點 Γ {\displaystyle \Gamma } 的點 z {\displaystyle z} 進行著色
要執行的迭代次數 n {\displaystyle n}
一個小 ε {\displaystyle \varepsilon }
對於所有點,計算 Σ n ( z , ε ) {\displaystyle \Sigma _{n}(z,\varepsilon )}
計算 E n {\displaystyle E_{n}} 和 σ n {\displaystyle \sigma _{n}}
計算
J ( z ) = ln ( δ + Σ n ( z ) ) − K {\displaystyle J(z)=\,\ln(\delta +\Sigma _{n}(z))-K}
對於某個常數 K {\displaystyle K} 。 因為 K {\displaystyle K} 將用於將屬於 Julia 集的點 ( J ( z ) > 0 {\displaystyle J(z)>0} ) 與不屬於 Julia 集的點 ( J < 0 {\displaystyle J<0} ) 分開, K {\displaystyle K} 的合理值大於 E n {\displaystyle E_{n}} 。 嘗試設定如 K = E n + 2 σ n {\displaystyle K=E_{n}+2\sigma _{n}} 或 E n + σ n {\displaystyle E_{n}+\sigma _{n}} 等等。 如果 J ( z ) > 0 {\displaystyle J(z)>0} ,那麼我們將 z {\displaystyle z} 著色為屬於 Julia 集。 如果 J ( z ) < 0 {\displaystyle J(z)<0} ,我們可以使用該值來為 Fatou 集著色。 如果我們知道某個吸引子,我們可以檢查 ƒ n {\displaystyle n} ( z ) {\displaystyle (z)} 是否接近它,並使用該資訊。
為了將值對映到飽和度和亮度的有效範圍內,我們使用第 輔助函式 h 部分中的函式 h {\displaystyle h} 。
計算 E n {\displaystyle E_{n}} 需要大量時間。 視覺化過程需要兩次傳遞
計算來自所有 Σ n ( z ) {\displaystyle \Sigma _{n}(z)} 的 E n {\displaystyle E_{n}}
使用 E n {\displaystyle E_{n}} 和重新計算的 Σ n ( z ) {\displaystyle \Sigma _{n}(z)} 對點進行著色
或者
計算並存儲所有 Σ n ( z ) {\displaystyle \Sigma _{n}(z)}
計算 E n {\displaystyle E_{n}} 並對這些點進行著色
另一種方法看起來像這樣
找到最小的 n {\displaystyle n} 使得 d k ( z , z + ε ) {\displaystyle d_{k}(z,z+\varepsilon )} 在所有 k ≥ n {\displaystyle k\geq n} 上都低於給定的邊界。如果找不到這樣的 n {\displaystyle n} ,則假設 z {\displaystyle z} 是朱利亞集的元素。否則,使用 n {\displaystyle n} 對法圖集進行著色。
此演算法是逃逸時間演算法 (ETA) 的變體。請注意,在 ETA 中,點實際上不會逃逸(至少如果我們在球體上),它只是收斂到 ∞。這種方法類似。但是,我們不需要知道 ƒ 的吸引不動點。
到目前為止,我沒有嘗試修改後的版本。一個缺點可能是法圖集將不再出現平滑的著色。然後我不確定這種修改是否真的有優勢,因為迭代必須完成,直到達到給定的最大迭代次數。請注意,即使 d n {\displaystyle d_{n}} 在某些 n {\displaystyle n} 上低於邊界,距離 d k {\displaystyle d_{k}} 可能會再次升高。我無法確定這種影響是否至關重要或可以忽略不計...
z ↦ z 2 {\displaystyle z\mapsto z^{2}}
z ↦ z 2 + i {\displaystyle z\mapsto z^{2}+i}
z ↦ z 2 − 1 {\displaystyle z\mapsto z^{2}-1}
z ↦ z 2 − 0.742 + i / 10 {\displaystyle {}_{z\mapsto z^{2}-0.742+i/10}}
z ↦ N z 3 − 1 {\displaystyle z\mapsto N_{z^{3}-1}}
z ↦ N z 3 − 2 z + 2 {\displaystyle z\mapsto N_{z^{3}-2z+2}}
N {\displaystyle N} 表示牛頓運算元
N : f ↦ i d − f f ′ {\displaystyle N:f\mapsto {\mathit {id}}-{\frac {f}{f'}}}
之前的方法可以生成簡潔平滑的著色,並且對過程的動力學知識要求最低。然而,它非常耗時。以下方法是多項式逃逸時間演算法 (ETA) 的擴充套件。
令 ƒ 為度數為 d > 1 的複數上的多項式。這樣的多項式最多有 d 個臨界點:無窮大和 ƒ′ 的最多 d –1 個零點。眾所周知,過程 z →ƒ(z ) 的每個吸引子至少吸收一個臨界點。假設 zK 是一個臨界值,則 ƒn (zK ) 會任意接近 ƒ 的一個吸引週期。
二次多項式 ƒ(z ) = z 2 + c 的過程是最簡單的情況:臨界值為 0 和 ∞。由於 ∞ 吸收自身,只剩下 0,我們有以下情況。M 表示曼德布羅集合。
c ∉ M {\displaystyle c\notin M}
簡單情況。0 被 ∞ 吸收,J (ƒ) 僅由康托爾塵埃組成。可以使用逃逸時間到 ∞ 來對所有點進行著色。
c ∈ M ∖ ∂ M {\displaystyle c\in M\setminus \partial M}
如果 c 是 M 內部的一個元素,則 0 將被一個 (超) 吸引週期吸收。計算 w = w ( c , n ) = f n ( 0 ) {\displaystyle w=w(c,n)=f^{n}(0)}
對於足夠大的 n 。由於 w (基本上) 僅依賴於 c ,因此可以在開始 J (ƒ) 的視覺化之前預先計算它。請注意,w 是可能具有多個元素的週期的元素,即 w 對於該週期來說只是唯一的。
然後,對 C 中的點 z 進行著色與 ETA 一樣簡單如果 z 被 ∞ 吸收,請使用逃逸時間來對 z 進行著色。
如果 ƒn (z ) 接近 w ,即如果 |ƒn (z ) – w| < ε 第一次出現,請使用該 n 來對 z 進行著色。
如果 ƒn (z ) 既不接近 ∞ 也未接近 w ,則將 z 著色為 J (ƒ) 的一部分。只有很少的 z 會屬於此類。
一些 t {\displaystyle t\,}
是一個平滑的、單調的 S形 從 −1 到 1 的轉換,它滿足 t ′ ( 0 ) = 1 {\displaystyle t'(0)=1} 和 t ( x ) = − t ( − x ) {\displaystyle t(x)=-t(-x)} 。有許多選擇。其中一些是
t : R → ( − 1 , 1 ) x ↦ tanh x ↦ 2 π arctan ( π 2 x ) ↦ 2 π gd ( π 2 x ) ↦ x 1 + x 2 ↦ x 1 + | x | {\displaystyle {\begin{aligned}t:\mathbb {R} &\to (-1,1)\\x&\mapsto \tanh \,x\\&\mapsto {\tfrac {2}{\pi }}\arctan \left({\tfrac {\pi }{2}}x\right)\\&\mapsto {\tfrac {2}{\pi }}\operatorname {gd} \left({\tfrac {\pi }{2}}x\right)\\&\mapsto {\frac {x}{\sqrt {1+x^{2}}}}\\&\mapsto {\frac {x}{1+|x|}}\\\end{aligned}}}
gd 表示 古德曼函式 。
h a {\displaystyle h_{a}\,}
輔助函式 h a {\displaystyle h_{a}} 與 t {\displaystyle t} 幾乎相同,但它對映到 ( 0 , 1 ) {\displaystyle (0,1)} ,我們可以透過引數 a {\displaystyle a} 調整過渡速度。
h a : R → ( 0 , 1 ) x ↦ 1 2 + 1 2 t ( 2 a x ) {\displaystyle {\begin{aligned}h_{a}:\mathbb {R} &\to (0,1)\\x\;&\mapsto {\tfrac {1}{2}}+{\tfrac {1}{2}}t(2ax)\end{aligned}}}
其中 a > 0 {\displaystyle a>0} 。那麼 h a {\displaystyle h_{a}} 關於點 (0, 1/2) 對稱,並且
h a ( 0 ) = 1 2 h a ′ ( 0 ) = a h a ( − ∞ ) = 0 + h a ( ∞ ) = 1 − {\displaystyle {\begin{alignedat}{2}h_{a}&(0)&&={\tfrac {1}{2}}\\h'_{a}&(0)&&=a\\h_{a}&(-\infty )&&=0^{+}\\h_{a}&(\infty )&&=1^{-}\\\end{alignedat}}}
負值被對映到 0 到 1/2 之間的數值。正值被對映到 1/2 到 1 之間的數值。引數 a {\displaystyle a} 控制過渡的速度。
如果我們想要一個下降函式,我們可以使用對稱性
h a ( x ) = 1 − h a ( − x ) = 1 − h − a ( x ) {\displaystyle h_{a}(x)\,=1-h_{a}(-x)=1-h_{-a}(x)}
也就是說,我們取負 x {\displaystyle x} 或 a {\displaystyle a} 。
g a , b {\displaystyle g_{a,b}\,}
此函式將正數對映到區間 [ 0 , 1 ) {\displaystyle [0,1)} 。
g a , b : R ⩾ 0 → ( 0 , 1 ) x ↦ 1 2 + 1 2 t ( 2 b ⋅ a ⋅ u ( x / a ) ) {\displaystyle {\begin{aligned}g_{a,b}:\mathbb {R} ^{\geqslant \,0}&\to (0,1)\\x\;&\mapsto {\tfrac {1}{2}}+{\tfrac {1}{2}}\,t(2b\cdot a\cdot u(x/a))\end{aligned}}}
對於以下定義的某個函式 u {\displaystyle u} 。如果 u {\displaystyle u} 選擇得當,那麼對於 g {\displaystyle g} 以下關係成立:
g a , b ( 0 ) = 0 g a , b ( ∞ ) = 1 g a , b ( a ) = 1 / 2 g a , b ′ ( a ) = b g a , b ′ ( x ) > 0 for x > 0 {\displaystyle {\begin{array}{lll}g_{a,b}(0)&=&0\\g_{a,b}(\infty )&=&1\\g_{a,b}(a)&=&1/2\\g'_{a,b}(a)&=&b\\g'_{a,b}(x)&>&0{\text{ for }}x>0\end{array}}}
這意味著 g a , b {\displaystyle g_{a,b}}
隨著 x {\displaystyle x} 從 0 {\displaystyle 0} 到 ∞ {\displaystyle \infty } 不斷增長,從 0 增長到 1
我們可以透過指定引數 a {\displaystyle a} 來控制 g {\displaystyle g} 穿過 0 到 1 之間中點的位置
我們可以透過指定引數 b {\displaystyle b} 來控制 g {\displaystyle g} 穿過點 ( a , 1 / 2 ) {\displaystyle (a,1/2)} 的速度
我們剩下要做的就是確定函式 u {\displaystyle u} 在 R > 0 {\displaystyle \mathbb {R} ^{>0}} 上的形式
u {\displaystyle u\,}
u {\displaystyle u} 必須滿足以下條件
u ( 0 + ) = − ∞ u ( ∞ ) = ∞ u ( 1 ) = 0 u ′ ( 1 ) = 1 {\displaystyle {\begin{array}{lll}u(0^{+})&=&-\infty \\u(\infty )&=&\infty \\u(1)&=&0\\u'(1)&=&1\end{array}}}
對於 u {\displaystyle u} 我們設定
u ( x ) = 1 2 ( x − 1 x ) {\displaystyle u(x)={\tfrac {1}{2}}\left(x-{\tfrac {1}{x}}\right)}
w a {\displaystyle w_{a}\,}
此函式將正數對映到區間 [ 0 , 1 ) {\displaystyle [0,1)} 。
w a : R ⩾ 0 → [ 0 , 1 ) x ↦ t ( a x ) {\displaystyle {\begin{aligned}w_{a}:\mathbb {R} ^{\geqslant \,0}&\to [0,1)\\x\;&\mapsto t(ax)\end{aligned}}}
透過 a {\displaystyle a} 我們可以控制它在原點的斜率
w ′ ( 0 ) = a {\displaystyle w'(0)=\,a}
一條圓弧透過 (0,0) 和 (1,1),在 (0,0) 處的斜率為 a {\displaystyle a} ,在 (1,1) 處的斜率為 − 1 / a {\displaystyle -1/a}
arc ( x ) = { x ; if a = 1 y 0 + sign ( ln a ) r 2 − ( x − x 0 ) 2 ; if a ≠ 1 {\displaystyle \operatorname {arc} (x)={\begin{cases}x&;{\text{ if }}a=1\\y_{0}+\operatorname {sign} (\ln a){\sqrt {r^{2}-(x-x_{0})^{2}}}&;{\text{ if }}a\neq 1\\\end{cases}}}
其中
x 0 = a a − 1 y 0 = 1 − x 0 r = x 0 2 + y 0 2 {\displaystyle {\begin{aligned}x_{0}&={\frac {a}{a-1}}\\y_{0}&=1-x_{0}\\r&={\sqrt {x_{0}^{2}+y_{0}^{2}}}\\\end{aligned}}}
圓心在直線 y = 1 − x {\displaystyle y=1-x} 上。
對引數平面和曼德勃羅集進行著色
通用著色演算法 : ( 畫素的特徵 -> 顏色 ): T : s c a l a r v a l u e → c o l o r v a l u e {\displaystyle T:scalarvalue\to colorvalue}