xak*_*p35 3 algorithm math glsl fractals complex-numbers
确实存在所谓的超操作序列。它的工作原理就像你a*b=a+a+a+a...+a用许多a重复b次数的加法来构造乘法。然后a^b = a*a*a*a*...*a进行a多次重复乘法的幂运算b。然后,出现tetration,表示为幂的塔,就像a^^b == a^a^a^...^a,重复b次数。
我对如何为浮点数和复数编写此函数感兴趣?
我已经在 glsl 中编写了乘法和幂函数:
// complex multiplication:
vec2 cmul(in vec2 a, in vec2 b) {
return vec2(a.x*b.x-a.y*b.y, a.x*b.y+a.y*b.x);
}
// complex exponent e^a
vec2 cexp(in vec2 a) {
float ea = exp(a.x);
float vl = a.y;
return ea * vec2( cos(vl), sin(vl) );
}
// complex natural logarithm ln(a)
vec2 cln(in vec2 a) {
float ql = length(a);
return vec2( log(ql), atan(a.y, a.x));
}
// complex power function a^b
vec2 cpow(in vec2 a, in vec2 b) {
return cexp(cmul(cln(a), b));
}
Run Code Online (Sandbox Code Playgroud)
但后来我被卡住了!我们如何编写ctet(in vec2 a, in vec2 b)tetration 函数,不仅适用于浮点数,还适用于整个复平面本身?
好吧,让我们从真正的域和整数 开始b:
a^^b = a^a^a^a^a...^a // a is there b times
Run Code Online (Sandbox Code Playgroud)
这可以在C++ 中这样评估:
a^^b = a^a^a^a^a...^a // a is there b times
Run Code Online (Sandbox Code Playgroud)
因为你已经得到了pow复杂的域,你也可以在那里做同样的事情......为了保持这个简单,我现在不会碰它......
这里有一些结果:
a\b| 1| 2| 3| 4
-------------------------------
1 | 1| 1| 1| 1
2 | 2| 4| 16|65536
3 | 3| 27|7625597484987|
4 | 4| 256| |
5 | 5|3125| |
Run Code Online (Sandbox Code Playgroud)
顺便提一句。所有这些超级操作都与阿克曼函数有关,您可以在这里找到我在 C++ 中的迭代实现:
然而,由于极快的增长甚至double很快就会超出范围(因此缺失值)......
现在如何移动b到Real 域?对此没有代数方法的线索,但几何方法是可能的。
简单地“绘制”a^^b作为变量b和常数的函数,a用于b您想要的实数周围的整数值,b然后使用整数域作为控制点插入实数域 。它类似于获得函数的非整数阶导数。b b
所以,(X,Y)将是你的(a^^b,b)。现在使用任何插值来构造实域函数。
线性插值将如下所示:
y0 = a^^(int(b))
y1 = a^^(int(b)+1)
a^^b = y0 + (b-int(b))*(y1-y0)
Run Code Online (Sandbox Code Playgroud)
然而,需要更高阶的插值,并且插值参数也应该缩放到非线性度量。有关更多信息,请参阅:
经过一些详细说明立方体 ( t^3) 和log^2比例证明是足够的(使用我的 128 位浮点f128类的C++ 示例只需将其重命名为double):
double tetration(double a,int b) // a^^b = a^a^a^a... b times
{
double c;
if (b<=0) return 0;
for (c=a;b>1;b--) c=pow(a,c);
return c;
}
Run Code Online (Sandbox Code Playgroud)
这是我与它的比较:
我选择相同的图形基地a距离a^^b,正如你可以看到它是一个很好的搭配范围仅低于1.0是稍微偏离。
让我们开始复杂域分形
现在当你想进入复杂域时,你不能像在 Real 中那样做,因为结果对于插值来说太混乱了。所以我们只能坚持整数b或者使用Kneser算法来计算。
对我们来说幸运的是,有更多的方法可以显示分形......例如,我们可以b从a^^b只有a复杂的地方评估整数,并使用结果为输出着色。这里是GLSL示例(基于我的Mandelbrot 着色器和您的复杂数学):
分段:
a\b| 1| 2| 3| 4
-------------------------------
1 | 1| 1| 1| 1
2 | 2| 4| 16|65536
3 | 3| 27|7625597484987|
4 | 4| 256| |
5 | 5|3125| |
Run Code Online (Sandbox Code Playgroud)
和四分预览:
这是我比较的:
它匹配我的结果只是反映在两者中 x,y
所以我所做的就是计算a^^100,其中a的片段在屏幕上复杂的结构域位置<-1,+1>有一些panning并zooming和呈现从结果构成的彩色...
我还在那里留下了一个测试函数(不是分形),我用来测试从这里获取的着色方法和复杂数学,第一个来自 Wiki,第二个是着色器结果(色轮):
你可以像 mandelbrot 或任何其他算法一样进行逃逸测试来显示分形。
这里是 tetration 的着色选项截图(我喜欢灰度) zoom=500.0 pos=-0.188418+0.234466i
最后pentation:
| 归档时间: |
|
| 查看次数: |
906 次 |
| 最近记录: |