📜  处理中的创意编程|第 2 组(洛伦兹吸引子)

📅  最后修改于: 2021-10-22 03:15:52             🧑  作者: Mango

处理中的创意编程|设置 1(随机游走器)
洛伦兹系统是一个常微分方程组,由美国数学家和气象学家 Edward Norton Lorenz 于 1963 年左右首先研究。它以对某些参数值和初始条件具有混沌解而著称。它源自地球大气对流的简化模型。它也自然出现在激光和发电机模型中。洛伦兹吸引子是洛伦兹系统的一组混沌解,绘制时类似于蝴蝶或八字形。下图出现在自然杂志 2000 年 8 月 31 日,第 949 页,是 Ian Stewart 撰写的题为“洛伦兹吸引子存在”的文章的一部分。

洛伦兹吸引器系统最常表示为 3 个耦合非线性微分方程 –

  • dx / dt = a (y - x)
  • dy / dt = x (b - z) - y
  • dz / dt = xy - c z

在上述方程组中,“a”有时称为普朗特数,“b”称为瑞利数。一组常用的常数是 a = 10, b = 28, c = 8 / 3。另一个是 a = 28, b = 46.92, c = 4。

Java微分方程的示例实现:-

int i = 0;
double x0, y0, z0, x1, y1, z1;
double h = 0.01, a = 10.0, b = 28.0, c = 8.0 / 3.0;
  
x0 = 0.1;
y0 = 0;
z0 = 0;
for (i = 0; i < N; i++) {
    x1 = x0 + h * a * (y0 - x0);
    y1 = y0 + h * (x0 * (b - z0) - y0);
    z1 = z0 + h * (x0 * y0 - c * z0);
    x0 = x1;
    y0 = y1;
    z0 = z1;
    // Printing the coordinates
    if (i > 100)
        System.out.println(i + " " + x0 + " " + y0 + " " + z0);
}

我们将尝试在Processing Java可视化地实现上述逻辑。由于我们将在 3d 中绘制点,我们需要使用 3d 渲染器。我们将在以下实现中使用 OPENGL 渲染器,但也可以使用 P3D 渲染器。我们还需要使用一个名为 PeasyCam 的外部处理库,它可以帮助我们为 3d 环境工作流程创建交互式相机对象。可以使用 Processing IDE 从工具 -> 添加工具 -> 库下载 PeasyCam。

我们还将使用以下函数来表示 Lorenz Attractor 结构-

  • beginShape() – 开始记录形状的顶点。
  • endShape() – 停止记录形状的顶点。
  • vertex() – 此函数用于指定点、线、三角形、四边形和多边形的顶点坐标。它专门用于beginShape()endShape()函数中。

Lorenz Attractor 在处理Java:-

/* FINAL SKETCH FOR LORENZ ATTRACTOR */
  
import peasy.*; // Importing peasy package
  
// Initialization
float x = 0.01, y = 0, z = 0;
float a = 10, b = 28, c = 8.0 / 3.0;
  
// ArrayList of PVector objects to store
// the position vectors of the points to be plotted.
ArrayList points = new ArrayList();
PeasyCam cam; // Declaring PeasyCam object
  
void setup()
{
    // Creating the output window
    // and setting up the OPENGL renderer
    size(800, 600, OPENGL);
  
    // Initializing the cam object
    cam = new PeasyCam(this, 500);
}
  
void draw()
{
    background(0);
  
    // Implementation of the differential equations
    float dt = 0.01;
    float dx = (a * (y - x)) * dt;
    float dy = (x * (b - z) - y) * dt;
    float dz = (x * y - c * z) * dt;
    x += dx;
    y += dy;
    z += dz;
  
    // Adding the position vectors to points ArrayList
    points.add(new PVector(x, y, z));
    translate(0, 0, -80);
    scale(5);
    stroke(255);
    noFill();
  
    // Beginning plotting of points
    beginShape();
    for (PVector v : points) {
        // Adding random color to the structure in each frame
        stroke(random(0, 255), random(0, 255), random(0, 255));
        vertex(v.x, v.y, v.z); // plotting the vertices
    }
    endShape(); // Drawing ends
}

输出:-

源材料

  • Daniel Shiffman 的编码训练编码挑战。
  • Paul Bourke 的 3D 洛伦兹吸引子。