1

我正在尝试在 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)。

图:算法产生的第一点

先感谢您。

4

1 回答 1

1

似乎如果dist < 0.001您没有更新x[2]orp[2]但您正在设置x[1]=x[2]and p[1]=p[2]。这意味着下次它循环时,距离将是0因为你正在做x[2]-x[1]p[2]-p[1]但它们彼此相等,所以你会得到dist = 0. 所以0 < 0.001你会一直重复这个并被困在同一点上。

你可能错过了类似的东西:

if (dist < 0.001) {
// other stuff
x[2] = map_x(x[1], p[1]);
p[2] = map_p(x[1], p[1]);
} else { // ...
于 2020-08-30T07:21:24.523 回答