Tôi đang giải quyết hệ thống khuếch tán phản ứng của Turing bằng mã C ++. Quá chậm: đối với kết cấu 128x128 pixel, số lần lặp có thể chấp nhận là 200 - kết quả là chậm 2,5 giây. Tôi cần 400 lần lặp để có được hình ảnh thú vị - nhưng 5 giây chờ đợi là quá nhiều. Ngoài ra, kích thước của kết cấu nên trên thực tế là 512x512 - nhưng điều này dẫn đến thời gian chờ đợi rất lớn. Các thiết bị là iPad, iPod.
Có bất kỳ cơ hội để làm điều này nhanh hơn? Phương pháp Euler hội tụ chậm (wikipedia) - có phương pháp nhanh hơn sẽ cho phép giảm số lần lặp?
EDIT: Như Thomas Klimpel đã chỉ ra, các dòng: "if (m_An [i] [j] <0.0) {...}", "if (m_Bn [i] [j] <0.0) {...}" đang trì hoãn hội tụ: sau khi xóa, hình ảnh có ý nghĩa xuất hiện sau 75 lần lặp . Tôi đã nhận xét ra các dòng trong mã dưới đây.
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();
}
}