Скачиваний:
0
Добавлен:
12.02.2026
Размер:
9.02 Кб
Скачать
% logistic_lamerey.m
% Реализация дискретного логистического отображения с визуализацией:
% - временной ряд
% - бифуркационная диаграмма (значения x при различных lambda)
% - спектр Ляпунова (Lyapunov exponent) по lambda
%
% Возможности: классическая карта; опционально: дополнительный член mu*x^p*(1-x)^q,
% сезонная модуляция параметра lambda, аддитивный и мультипликативный шум.
%
% Автор: кузнецов Д.А.
% Дата: 07.12.2024
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

clear; close all; clc;

%% Параметры симуляции
rng(1); % фиксируем случайность для воспроизводимости

% Выбор модели:
use_extended = true; % true — использовать расширенную карту; false — классическая
use_seasonal = false; % true — включить сезонную модуляцию lambda
use_noise = false; % true — включить стохастику

% Основные параметры
lambda_min = 2.5;
lambda_max = 4.0;
lambda_step = 0.002; % шаг по параметру для бифуркационной диаграммы
lambda_vals = lambda_min:lambda_step:lambda_max;

N_trans = 500; % число итераций для отбрасывания транзиента
N_keep = 200; % число итераций для отображения в бифуркации
N_total = N_trans + N_keep;

% Параметры расширения (если use_extended==true)
mu = -0.02; % управляющий коэффициент дополнительного члена (полож./отриц.)
p = 2; q = 2; % степени в дополнительном слагаемом mu*x^p*(1-x)^q

% Сезонная модуляция (опционально)
A = 0.0; % амплитуда модуляции
nu = 1/10; % частота модуляции (циклы на поколение)
phi = 0.0; % фаза

% Шумовые параметры (опционально)
sigma_mul = 0.0; % стандартное отклонение мультипликативного шума (доля)
sigma_add = 0.0; % стандартное отклонение аддитивного шума (абсолютно в [0,1] шкале)

if use_noise
sigma_mul = 0.02;
sigma_add = 0.0;
end

% Инициализация начального условия
x0 = 0.123456; % фиксированное начальное значение в (0,1); можно варьировать

%% Функция карты (встроена как анонимная функция)
% классическая карта: f(x, lambda) = lambda*x.*(1-x)
% расширение: + mu * x^p * (1-x)^q
% сезонная модуляция добавляется внутри симуляции

%% Подготовка для бифуркационной диаграммы и Lyapunov
num_lambda = numel(lambda_vals);
bif_x = cell(1, num_lambda); % для хранения значений x для каждого lambda
lyap = nan(1, num_lambda); % Lyapunov exponent

%% Основной цикл по параметру lambda
fprintf('Запуск симуляций по %d значениям lambda...\n', num_lambda);
tic;
for i = 1:num_lambda
lambda = lambda_vals(i);

% вектор для хранения траектории
x = zeros(1, N_total);
x(1) = x0;
sum_log_deriv = 0; % накопитель для Lyapunov (сумма логов производной)
valid_lyap_count = 0;

for n = 1:(N_total-1)
% вычисление локального параметра lambda_n с учётом сезонности/управления
lambda_n = lambda;
if use_seasonal
lambda_n = lambda + A * sin(2*pi*nu*n + phi);
end

% мультипликативный шум для lambda (опционально)
if use_noise
xi = sigma_mul * randn();
lambda_n = lambda_n * (1 + xi);
end

% основная карта (без шума)
if ~use_extended
f = lambda_n * x(n) * (1 - x(n));
df_dx = lambda_n * (1 - 2*x(n));
else
% расширенная карта
base = lambda_n * x(n) * (1 - x(n));
extra = mu * (x(n)^p) * ((1 - x(n))^q);
f = base + extra;
% аналитическая производная
% df/dx = lambda_n*(1 - 2x) + mu*[p*x^(p-1)*(1-x)^q - q*x^p*(1-x)^(q-1)]
df_dx = lambda_n * (1 - 2*x(n)) + mu * ( p * x(n)^(p-1) * (1-x(n))^q - q * x(n)^p * (1-x(n))^(q-1) );
end

% добавление аддитивного шума
if use_noise
eps = sigma_add * randn();
x_next = f + eps;
else
x_next = f;
end

% соблюдение физического ограничения: оставляем в [0,1]
x_next = max(0, min(1, x_next));
x(n+1) = x_next;

% аккумулируем логарьм для Lyapunov (после некоторой стартовой фазы)
if n > N_trans % считаем Lyapunov по значениям в стационарной части
% исключаем случаи df_dx == 0
if abs(df_dx) > 0
sum_log_deriv = sum_log_deriv + log(abs(df_dx));
valid_lyap_count = valid_lyap_count + 1;
end
end
end

% сохраняем последние N_keep точек для бифуркационной диаграммы
bif_x{i} = x(N_trans+1:end);

% Lyapunov: среднее логарифма производной по стационарной части
if valid_lyap_count > 0
lyap(i) = sum_log_deriv / valid_lyap_count;
else
lyap(i) = NaN;
end
end
toc;
fprintf('Симуляции завершены.\n');

%% Построение бифуркационной диаграммы
figure('Name','Bifurcation Diagram','NumberTitle','off','Color','w','Position',[100 100 800 600]);
hold on;
% рисуем точки (lambda, x) — аккуратно, чтобы не было переполнения
for i = 1:num_lambda
L = lambda_vals(i);
Xs = bif_x{i};
% рисуем как маленькие точки
plot( L * ones(size(Xs)), Xs, '.k', 'MarkerSize', 1 );
end
xlabel('\lambda');
ylabel('x');
title('Bifurcation diagram of logistic-like map');
xlim([lambda_min lambda_max]);
ylim([0 1]);
box on;
hold off;

%% Построение Lyapunov exponent
figure('Name','Lyapunov Exponent','NumberTitle','off','Color','w','Position',[950 100 600 400]);
plot(lambda_vals, lyap, '-b', 'LineWidth', 1);
hold on;
yline(0,'--r','LineWidth',1);
xlabel('\lambda');
ylabel('Lyapunov exponent');
title('Lyapunov exponent vs \lambda');
xlim([lambda_min lambda_max]);
grid on;
hold off;

%% Пример временного ряда для выбранного lambda
lambda_example = 3.7; % пример значения
% симулируем один ряд для отображения поведения во времени
x = zeros(1, N_total);
x(1) = x0;
for n = 1:(N_total-1)
lambda_n = lambda_example;
if use_seasonal
lambda_n = lambda_n + A * sin(2*pi*nu*n + phi);
end
if use_noise
lambda_n = lambda_n * (1 + sigma_mul*randn());
end
if ~use_extended
f = lambda_n * x(n) * (1 - x(n));
df_dx = lambda_n * (1 - 2*x(n));
else
base = lambda_n * x(n) * (1 - x(n));
extra = mu * (x(n)^p) * ((1 - x(n))^q);
f = base + extra;
df_dx = lambda_n * (1 - 2*x(n)) + mu * ( p * x(n)^(p-1) * (1-x(n))^q - q * x(n)^p * (1-x(n))^(q-1) );
end
if use_noise
x_next = f + sigma_add*randn();
else
x_next = f;
end
x(n+1) = max(0, min(1, x_next));
end

figure('Name','Time Series Example','NumberTitle','off','Color','w','Position',[100 750 800 300]);
plot(1:N_total, x, '-k');
xlabel('Iteration n');
ylabel('x_n');
title(sprintf('Time series example, \\lambda = %.3f', lambda_example));
xline(N_trans,'--r','Transient cutoff');
grid on;

%% Конец скрипта
fprintf('Готово.\n');
Соседние файлы в папке Лестница Ламиэля