gpt4 book ai didi

java - Clojure/Java Mandelbrot 分形绘图

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:18:52 24 4
gpt4 key购买 nike

我正在尝试移植这个 algorithm clojure.

我的代码是

(defn calc-iterations [x y] 
(let [c (struct complex x y)]
(loop [z (struct complex 0 0)
iterations 0]
(if (and (< 2.0 (abs z))
(> max-iterations iterations))
iterations
(recur (add c (multiply z z)) (inc iterations))))))

Multiply、add 和 abs 函数正常工作。我用计算器测试了它们。但是对于以下值:

(calc-iterations 0.60703135 -0.33984375) ; should give me 2, instead I get 4
(calc-iterations -1.8421874 0.3515625 ) ; should give me 1, instead I get 3

我正在使用我在网上找到的另一个 Java 小程序检查正确的迭代次数。它似乎可以正常工作,因为它会产生正确的输出。其迭代函数为

protected int calcIterations( float x, float y ) {
int iterations = 0;

float xn = x, yn = y;

while ( iterations < MAX_ITERATIONS ) {
float xn1 = xn*xn - yn*yn;
float yn1 = 2*xn*yn;

xn = xn1 + x;
yn = yn1 + y;

float magsq = xn*xn + yn*yn;

if ( magsq > 4 )
break;

iterations++;
}

System.out.println( x + " " + y + " " + iterations );
return iterations;
}

谁能发现我的错误?

最佳答案

我发现了两个差异

  1. Java 实现从 z = (x, y) 开始,而不是您的从 (0, 0) 开始。由于您的递归公式是 z = z^2 + c, (0, 0)^2 + (x, y) = (x, y) 所以从 (x, y) 开始与第一次迭代相同。因此,迭代次数会比你的少一次。
  2. Java 实现在检查结果 z 是否在距原点 2 个单位的范围内之后递增迭代次数,否则不会递增它,而您的每次递增迭代次数。迭代次数也会因此比您少一次。

所以这可能是您结果不同的原因。

我认为你的实现更正确,因为它区分了 |z| 的情况。 > 2 在一次迭代后(即 |(x,y)| > 2),以及 |z| > 2 在两次迭代后(即 |(x^2-y^2+x, 2xy+y)| > 2),而 Java 实现将执行其第一次迭代,给出 (x^2-y^2+x , 2xy+y), 并在增加迭代次数之前退出, 因此不区分这种情况。

关于java - Clojure/Java Mandelbrot 分形绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1112197/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com