Скачиваний:
0
Добавлен:
12.02.2026
Размер:
9 Кб
Скачать
% 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');
Соседние файлы в папке Лестница Ламиэля