如何获得吸引分形的牛顿法盆地的颜色梯度
How to get color gradient for Newton Method basin of attraction fractal
我正在使用 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 种颜色的边界。
如果您想查看此程序的完整代码,请告诉我。
谢谢
将达到收敛所需的迭代次数添加为一种颜色。在HSV中定义颜色,并使迭代次数映射到HSV的值S。这将为您提供漂亮且有意义的颜色渐变,而无需真正改变颜色。
伪代码为:
为此,像您一样生成 3 种颜色 mycolors
。将它们的颜色 space 更改为 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
,但它不太重要。
调整颜色值的范围和限制以获得更好的地图。通常还使用非线性映射,其中将函数 f
应用于迭代值,例如 sigmoid。
这是您可以在维基百科中找到的用于牛顿分形的技术,例如:
我正在使用 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 种颜色的边界。
如果您想查看此程序的完整代码,请告诉我。 谢谢
将达到收敛所需的迭代次数添加为一种颜色。在HSV中定义颜色,并使迭代次数映射到HSV的值S。这将为您提供漂亮且有意义的颜色渐变,而无需真正改变颜色。
伪代码为:
为此,像您一样生成 3 种颜色 mycolors
。将它们的颜色 space 更改为 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
,但它不太重要。
调整颜色值的范围和限制以获得更好的地图。通常还使用非线性映射,其中将函数 f
应用于迭代值,例如 sigmoid。
这是您可以在维基百科中找到的用于牛顿分形的技术,例如: