我正在使用以下C ++代码解决Turing的反应扩散系统。它太慢了:对于128x128像素纹理,可接受的迭代次数为200 –导致2.5秒的延迟。我需要进行400次迭代才能获得有趣的图像-但是等待5秒钟太多了。同样,纹理的大小实际上应为512x512-但这会导致大量的等待时间。设备是iPad,iPod。
有没有机会更快地做到这一点?欧拉方法收敛缓慢(维基百科)–使用更快的方法可以减少迭代次数吗?
编辑:正如托马斯·克里姆佩尔(Thomas Klimpel)所指出的,这些行:“ if(m_An [i] [j] <0.0){...}”,“ if(m_Bn [i] [j] <0.0){...}”延迟收敛:移除后,经过75次迭代后会出现有意义的图像。我在下面的代码中注释掉了这些行。
void TuringSystem::solve( int iterations, double CA, double CB ) {
    m_iterations = iterations;
    m_CA = CA;
    m_CB = CB;
    solveProcess();
}
void set_torus( int & x_plus1, int & x_minus1, int x, int size ) {
    // Wrap "edges"
    x_plus1 = x+1;
    x_minus1 = x-1;
    if( x == size - 1 ) { x_plus1 = 0; }
    if( x == 0 ) { x_minus1 = size - 1; }
}
void TuringSystem::solveProcess() {
    int n, i, j, i_add1, i_sub1, j_add1, j_sub1;
    double DiA, ReA, DiB, ReB;
    // uses Euler's method to solve the diff eqns
    for( n=0; n < m_iterations; ++n ) {
        for( i=0; i < m_height; ++i ) {
            set_torus(i_add1, i_sub1, i, m_height);
            for( j=0; j < m_width; ++j ) {
                set_torus(j_add1, j_sub1, j, m_width);
                // Component A
                DiA = m_CA * ( m_Ao[i_add1][j] - 2.0 * m_Ao[i][j] + m_Ao[i_sub1][j]   +   m_Ao[i][j_add1] - 2.0 * m_Ao[i][j] + m_Ao[i][j_sub1] );
                ReA = m_Ao[i][j] * m_Bo[i][j] - m_Ao[i][j] - 12.0;
                m_An[i][j] = m_Ao[i][j] + 0.01 * (ReA + DiA);
                // if( m_An[i][j] < 0.0 ) { m_An[i][j] = 0.0; }
                // Component B
                DiB = m_CB * ( m_Bo[i_add1][j] - 2.0 * m_Bo[i][j] + m_Bo[i_sub1][j]   +   m_Bo[i][j_add1] - 2.0 * m_Bo[i][j] + m_Bo[i][j_sub1] );
                ReB = 16.0 - m_Ao[i][j] * m_Bo[i][j];
                m_Bn[i][j] = m_Bo[i][j] + 0.01 * (ReB + DiB);
                // if( m_Bn[i][j] < 0.0 ) { m_Bn[i][j]=0.0; }
            }
        }
        // Swap Ao for An, Bo for Bn
        swapBuffers();
    }
}