如何获得牛顿法吸引分形的颜色梯度

时间:2019-03-12 14:03:10

标签: matlab matlab-figure fractals

我正在使用MATLAB在复杂平面中穿过NxN网格,x是实数分量,而y是虚数分量。对于此网格上的每个点,我都将其用作牛顿法的起点。根据其收敛到的根,分配一个数字。该数字与pcolor一起使用以绘制分形。

它绘制得很好,但是,我还想根据收敛到根所花费的时间来绘制暗度。我在使用pcolor时遇到麻烦。我能够获得3种根的3种颜色,但是我不确定如何添加更多颜色,以便更具描述性。

这里是我获得情节后的情节的代码
xp-x点数组
yp-y点的数组
col-具有1、2、3(对应于哪个根)的NxN矩阵

% thresholds for color
caxis([1 3]); 

% sets colors Red, Green, Blue
mycolors = [1 0 0; 0 1 0; 0 0 1];
colormap(mycolors);

% real component on x and imaginary component on y
h=pcolor(xp, yp, col');
set(h, 'LineStyle', 'none' );

所以,我怎么能在pcolor中找到一个渐变,看来pcolor只是能够计算出所有颜色本身。 caxis仅允许2种颜色的边界。

如果您想查看该程序的完整代码,请告诉我。 谢谢

1 个答案:

答案 0 :(得分:0)

将获得收敛所需的迭代次数添加为一种颜色。在HSV中定义颜色,并使迭代次数映射到HSV的值S。这将为您提供一个不错且有意义的颜色渐变,而无需真正更改颜色。

伪代码为:

为此,请生成3种颜色mycolors。将其色彩空间更改为mycolorshsv=rgb2hsv(mycolors);

您现在想要的是为每种颜色生成一束(您选择的)颜色。

mycolorshsv=repelem(mycolorshsv,N,1);

现在,让每种颜色生成N渐变。

mycolorshsv(    1:  N,2)=linspace(0,1,N);
mycolorshsv(  N+1:2*N,2)=linspace(0,1,N);
mycolorshsv(2*N+1:3*N,2)=linspace(0,1,N);

您想要您获得的maxiter最长的迭代是最亮的。现在,我们需要将col的矩阵从[1,2,3]转换为当前范围。为此,

col=(col-1)*N+1; % make 1=>1, 2=>N, 3=>2*N;
col=col+iteration_matrix; %max(iteration_matrix) must be maxiter. You may want to normalize so min(iteration_matrix) is 0

现在只需设置colormap(mycolors);,我将使用imagesc代替pcolor,但它的重要性不大。

播放范围和colro值的限制以获得更好的地图。通常还会使用非线性映射,其中将函数f应用于迭代值,例如S形。

这是用于Wikipedia中的牛顿分形的技术,例如:

enter image description here