用于多重分形分析的MATLAB程序,基于MF-DFA(多重分形去趋势波动分析)方法实现。该程序适用于股市、材料学、医学和岩石物理等领域的一维时间序列分析。
function [hq, tauq, alpha, f_alpha] = MF_DFA(data, q_min, q_max, q_step, scale_min, scale_max, order)
% 输入参数:
% data : 输入数据 (一维时间序列)
% q_min : q的最小值 (建议: -5)
% q_max : 最大值 (建议: 5)
% q_step : q的步长 (建议: 0.25)
% scale_min : 最小尺度 (建议: 10)
% scale_max : 最大尺度 (建议: length(data)/4)
% order : 多项式阶数 (1:线性, 2:二次, 3:三次)
%
% 输出参数:
% hq : 广义Hurst指数
% tauq : 质量指数 τ(q)
% alpha : 奇异性指数
% f_alpha : 多重分形谱 f(α)
% 参数校验
if nargin < 7, order = 1; end
if scale_max > length(data)/4
warning('scale_max reduced to N/4');
scale_max = floor(length(data)/4);
end
% 生成q向量和尺度向量
q = q_min:q_step:q_max;
scales = unique(round(logspace(log10(scale_min), log10(scale_max), 30));
% 步骤1: 积分序列
N = length(data);
Y = cumsum(data - mean(data));
% 预分配波动函数矩阵
Fq = zeros(length(scales), length(q));
% 步骤2-4: 多尺度处理
for sidx = 1:length(scales)
s = scales(sidx);
Ns = floor(N/s);
segments = 2*Ns;
F2_segments = zeros(segments, 1);
% 分割数据段
for v = 1:segments
if v <= Ns
segment = Y((v-1)*s + 1 : v*s);
else
segment = Y(N - (v-Ns)*s + 1 : N - (v-Ns-1)*s);
end
% 多项式拟合去趋势
x = (1:s)';
p = polyfit(x, segment, order);
fit = polyval(p, x);
detrended = segment - fit;
% 计算方差
F2_segments(v) = mean(detrended.^2);
end
% 步骤5: 计算q阶波动函数
for qidx = 1:length(q)
q_val = q(qidx);
if q_val == 0
Fq(sidx, qidx) = exp(0.5 * mean(log(F2_segments(F2_segments>0))));
else
Fq(sidx, qidx) = (mean(F2_segments.^(q_val/2))).^(1/q_val);
end
end
end
% 步骤6: 计算广义Hurst指数
hq = zeros(size(q));
for qidx = 1:length(q)
log_scales = log10(scales(:));
log_Fq = log10(Fq(:, qidx));
p = polyfit(log_scales, log_Fq, 1);
hq(qidx) = p(1);
end
% 步骤7: 计算质量指数
tauq = q .* hq - 1;
% 步骤8: 计算多重分形谱
dtauq = gradient(tauq, q_step);
alpha = dtauq;
f_alpha = q .* alpha - tauq;
% 可视化结果
figure('Color', 'white', 'Position', [100, 100, 1200, 500])
subplot(1,3,1)
plot(q, hq, 'bo-', 'LineWidth', 1.5)
xlabel('q', 'FontSize', 12)
ylabel('h(q)', 'FontSize', 12)
title('广义Hurst指数', 'FontSize', 14)
grid on
subplot(1,3,2)
plot(q, tauq, 'ro-', 'LineWidth', 1.5)
xlabel('q', 'FontSize', 12)
ylabel('\tau(q)', 'FontSize', 12)
title('质量指数', 'FontSize', 14)
grid on
subplot(1,3,3)
plot(alpha, f_alpha, 'ko-', 'LineWidth', 1.5)
xlabel('\alpha', 'FontSize', 12)
ylabel('f(\alpha)', 'FontSize', 12)
title('多重分形谱', 'FontSize', 14)
grid on
% 输出多重分形强度
Delta_alpha = max(alpha) - min(alpha);
fprintf('多重分形强度 Δα = %.4f\n', Delta_alpha);
end
使用
% 示例1: 布朗运动 (单分形)
data = cumsum(randn(1,5000));
[hq, tauq, alpha, f_alpha] = MF_DFA(data, -5, 5, 0.25, 10, 1000, 2);
% 示例2: 股票收益率 (上证指数)
load('stock_data.mat'); % 加载数据
returns = diff(log(prices)); % 计算对数收益率
[hq, tauq, alpha, f_alpha] = MF_DFA(returns, -5, 5, 0.25, 10, length(returns)/4, 2);
参数说明
输入参数:
data:输入时间序列 (股市价格、医学信号、材料特性数据等)q_min,q_max,q_step:q值范围和步长 (建议范围[-5,5])scale_min,scale_max:尺度范围 (建议10到N/4)order:去趋势多项式阶数 (1-3)
输出参数:
hq:广义Hurst指数,描述不同q值的标度行为tauq:质量指数,表征多重分形特征alpha:奇异性指数f_alpha:多重分形谱,量化不同奇异性水平的分布
关键输出:
- 多重分形强度
Δα = max(α) - min(α):- Δα≈0:单分形
- Δα>0:多重分形 (值越大表示多重分形特性越强)
- 多重分形强度
参考代码 多重分形 MATLAB程序 www.youwenfan.com/contentalc/98556.html,可用于股市分析,材料学、医学、岩石物理等领域。
应用领域说明
股市分析:
- 分析价格波动的复杂性和风险结构
- 识别市场状态转变 (单分形→多重分形)
- 示例:计算股票收益率的Δα,值越大市场越复杂
材料学:
- 表征材料表面的粗糙度
- 分析断裂表面的复杂特性
- 示例:金属疲劳断口的多重分形谱分析
医学:
- EEG/ECG信号复杂性分析
- 病理状态检测 (如癫痫、心律失常)
- 示例:健康ECG的Δα < 病态ECG
岩石物理:
- 孔隙结构表征
- 渗流特性分析
- 示例:砂岩比页岩具有更大的Δα
注意事项
- 数据长度应 > 1000点,保证统计可靠性
scale_max不超过数据长度的1/4- 多重分形强度解释:
- Δα < 0.05:近似单分形
- Δα > 0.5:强多重分形
- 股市危机时期Δα通常增大
此程序提供了多重分形分析的核心实现,用户可通过调整参数适应不同领域数据特性。对于二维图像分析(如材料表面、医学影像),需扩展为二维MF-DFA方法。