我正在尝试在 C 中实现 Parker 和 Chua 的算法,如“混沌系统的实用数值算法”(第 6 章)一书中所述。
在那一章中,作者描述了一种为离散时间系统(又名地图)绘制流形的方法。我正在尝试将给出的伪代码翻译成标准地图(Chirikov-Taylor)的 C 代码。我已经为 Fortran 做过,现在 C 给出了与 Fortran 90 相同的问题。
这个想法是在(不稳定的,暂时的)流形上显示点,以使它们之间的距离与给定的容差不远。如果是这样,则对点进行线性插值。正如作者所说,就像一扇窗户移动并揭示了歧管。
问题是输出在流形上给出了一些点,但在几个点之后,输出挂在一个值上。
我被警告过 C 和 Fortran,特别是数组索引。但我看不出该方法或我从伪代码的翻译有什么问题......
我知道有很多流形可视化方法和有关它的论文,但是如果我不能从给定的伪代码构造一个,我怀疑我的其他实现是否以正确的方式......所以我更喜欢让它工作.
好吧,让我展示一下我的代码的简化版本,它应该可以工作(在 C 中):
x_bar = alpha * vx;
y_bar = alpha * vy;
//choose linear approximation as initial condition
x[0] = x_bar;
p[0] = y_bar;
//iterate once
x[1] = map_x(x[0], p[0]);
p[1] = map_p(x[0], p[0]);
//iterate again
x[2] = map_x(x[1], p[1]);
p[2] = map_p(x[1], p[1]);
x_new = x[1];
y_new = p[1];
do
{
dist = sqrt( pow((x[2] - x[1]), 2.) + pow((p[2] - p[1]), 2.) );
if(dist < 0.001) //absolute criteria for while...
{
//accept the point and move the window
printf("%f\t %f\n", x[0], p[0]);
x[0] = x[1];
p[0] = p[1];
x[1] = x[2];
p[1] = p[2];
i++;
}
else
{
//linear interpolation required
x_new = (x[0] + x_new) / 2.;
y_new = (p[0] + y_new) / 2.;
x_aux = map_x(x_new, y_new);
y_aux = map_p(x_new, y_new);
x[2] = x_aux;
p[2] = y_aux;
}
}
while(i < 10);
在上面的代码中,vx 和 vy 是雅可比矩阵的特征向量,在固定点 (x, p) = (0, 0) 处求值。我的函数“map_x”和“map_p”运行良好,并返回 Chirikov-Taylor 地图的一步迭代。
我附上了由我的代码的第一步生成的图。考虑 r = (x, p)。
先感谢您。