Как векторизовать начальные условия - PullRequest
0 голосов
/ 07 октября 2019

Я пытаюсь векторизовать начальные условия (x) и (y), чтобы построить несколько странных аттракторов при различных начальных условиях, в то время как каждое начальное условие имеет отдельный цветовой график. Но я не уверен, как векторизовать начальные условия и сделать каждый график начальных условий отдельным цветом.

Мои мысли должны были иметь x и y вектор x = [7.4,6.3,3.4,5.4,4.5] y = [. 6, .3, .8, .3, .14] и каждое начальное условие x и y создает свой собственный график с другим цветом (ноэто не работает, потому что оно хочет одно значение, а не несколько значений). Ниже показано, как будет выглядеть один из графиков начальных значений x (k) и y (k).

plot

Рабочий код ниже не векторизован:

x(1)=[7.4];
y(1)=[.6];
a = -1.24458;
b = -1.25191;
c = -1.815908;
d = -1.90866;

maxiter = 10000;
z = linspace(1,maxiter+1,maxiter+1);
for k=1:maxiter

% Clifford Attractors

  x(k+1) = sin(a*y(k)) + c*cos(a*x(k));
  y(k+1) = sin(b*x(k)) + d*cos(b*y(k));
end

scatter(x,y,'.')

Ps: я использую 64-битную Ubuntu Linux Octave 4.2.2, которая похожа на Matlab

1 Ответ

0 голосов
/ 09 октября 2019

Вы можете просто использовать матрицу вместо вектора и рассматривать каждую строку как одну итерацию. Чтобы немного ускорить процесс, мы можем выделить матрицу в начале. Чтобы нанести на график различные прогоны, нам нужно просто перебрать их и каждый раз использовать разные цвета:

x0=[7.4,6.3,3.4,5.4,4.5];
y0=[.6,.3,.8,.3,.14];
a = -1.24458;
b = -1.25191;
c = -1.815908;
d = -1.90866;

maxiter = 1000;
z = linspace(1,maxiter+1,maxiter+1);
N = numel(x0);
x = [x0;NaN(maxiter, N)];
y = [x0;NaN(maxiter, N)];
for k=1:maxiter

% Clifford Attractors

  x(k+1,:) = sin(a*y(k,:)) + c*cos(a*x(k,:));
  y(k+1,:) = sin(b*x(k,:)) + d*cos(b*y(k,:));
end

colors = 'rgbymcwk';
hold on
for n=1:N
    scatter(x(:,n), y(:,n), ['.',colors(1+mod(n,numel(colors)))])
end
...