【MATLAB第111期】基于MATLAB的sobol全局敏感性分析方法二阶指数计算

【MATLAB第111期】基于MATLAB的sobol全局敏感性分析方法二阶指数计算

一、简介

在MATLAB中计算Sobol二阶效应指数通常涉及到全局敏感性分析(Global Sensitivity Analysis, GSA),其中Sobol方法是一种流行的技术,用于评估模型输入参数的敏感性。Sobol二阶效应指数衡量的是两个参数之间的交互作用对模型输出的影响。

Sobol二阶效应指数的计算涉及到以下步骤:

1、生成Sobol序列,并在一阶的基础上,生成N=(2D+2)*npop个样本集,其中D为变量数, npop为采样的数量, N为总样本数 。
在一阶基础上,N=(D+2)*nPop样本, 包含A、AB和B矩阵。
二阶需要生成BA矩阵,用来评估二阶指数。

2、模型计算
可参考64期文章, 利用sobol函数进行抽样,得到的X值 ,通过bp组成的代理模型进行计算。

3、计算Sobol指数:使用Sobol序列和模型输出,计算每个参数的一阶、二阶效应指数和总效应指数, 其中,一阶和总效应指数较为好计算, 二阶效应指数可以参考python的Salib库进行研究 ,

Sobol二阶效应指数的计算公式如下:
在这里插入图片描述
其中i为1:D,j为i+1:D,
4、计算效果
在这里插入图片描述

在这里插入图片描述

二、部分源码

S2计算代码如下:

 Vjk = mean(BAj .* ABk - A .* B) / var(y);
    Sj = first_order(A, ABj, B);
    Sk = first_order(A, ABk, B);
    S2 = Vjk - Sj - Sk;

核心参考代码如下(需要自行二次编译):



    % Normalize the model output
    Y = (Y - mean(Y)) / std(Y);
    % Separate output values
    A = Y(1:2*D+2:end);
    B = Y((end-1):-(2*D+1):1);
    AB = zeros(length(Y)/ (2*D+2), D);
        BA = zeros(length(Y)/ (2*D+2), D);
        for j = 1:D
            AB(:, j) = Y((j+1):2*D+2:end);
            BA(:, j) = Y((j+1+D):2*D+2:end);
        end
    end

    % Calculate second order indices if required

        for j = 1:D
            for k = j+1:D
                Si.S2(j, k) = second_order(A, AB(:, j), AB(:, k), BA(:, j), B);
end
end
function S = first_order(A, AB, B)
    % First order estimator following Saltelli et al. 2010 CPC, normalized by
    % sample variance
    y = [A, B];
    if range(y) == 0
        warning('Constant values encountered, indicating model evaluations (or subset of evaluations) produced identical values.');
        S = 0;
        return;
    end
    S = mean(B .* (AB - A)) / var(y);
end

function S = total_order(A, AB, B)
    % Total order estimator following Saltelli et al. 2010 CPC, normalized by
    % sample variance
    y = [A, B];
    if range(y) == 0
        warning('Constant values encountered, indicating model evaluations (or subset of evaluations) produced identical values.');
        S = 0;
        return;
    end
    S = 0.5 * mean((A - AB) .^ 2) / var(y);
end

function S = second_order(A, ABj, ABk, BAj, B)
    % Second order estimator f ollowing Saltelli 2002
    y = [A, B];
    if range(y) == 0
        warning('Constant values encountered, indicating model evaluations (or subset of evaluations) produced identical values.');
        S = 0;
        return;
    end
    Vjk = mean(BAj .* ABk - A .* B) / var(y);
    Sj = first_order(A, ABj, B);
    Sk = first_order(A, ABk, B);
    S = Vjk - Sj - Sk;
end

三、代码获取

1.阅读首页置顶文章
2.关注CSDN
3.根据自动回复消息,私信回复“111期”以及相应指令,即可获取对应下载方式。

### Sobol指数的数学定义与计算公式 #### 定义 Sobol指数是一种用于量化输入参数不确定性对模型输出影响的方法。具体来说,Sobol指数衡量的是某个特定输入变量或一组输入变量对于模型输出方差贡献的比例。 设 \( Y \) 是由函数 \( f(\mathbf{X}) \) 给定的输出,其中 \( \mathbf{X} = (X_1, X_2, ..., X_d) \) 表示 d 个独立随机输入变量组成的向量,则总方差可以分解为: \[ D = Var[Y] = E[(Y-E[Y])^2] \] 为了评估单个输入因素的重要性,引入了一阶Sobol索引 \( S_i \),它表示仅由于第 i 个输入引起的输出变化占总体变异性的比例: \[ S_i = \frac{V[E(Y|X_i)]}{Var[Y]} \quad\text{(一阶)}[^1]\] 这里 \( V[E(Y|X_i)] \) 描述了当固定其它所有因子不变时,改变 Xi 导致的结果波动程度;而分母则是整体响应的变化范围。 除了上述的一阶效应外,还存在高阶交互作用项,比如二阶组合 \( S_{ij} \): \[ S_{ij}= \frac{\mathrm {E} [\operatorname {var} _{{x}_{j}}(f(x)|x_{i})]-\mathrm {E} [\operatorname {var} _{{x}_{k}, k\notin{i,j}}(f(x))]}{\sigma ^{2}(y)}, \qquad j<i \quad\text{(二阶)}\] 最终,总的敏感度指标 TSi 可以通过累加各个低级子集的影响获得: \[ T_i=S_i+\sum_j^{d}S_{ij}+...=\frac{\int ... \int var[\bar{f}_i(X)]p(X)dX } {\sigma^2(y)} \quad\text{(全阶)}\] 这些表达式提供了关于如何估计不同层次上的不确定性和相互依赖关系的信息。 ```matlab % MATLAB代码片段展示如何估算Sobol指数 function Si = sobol_index(f, N, param_bounds) % 这里省略具体的实现细节... end ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随风飘摇的土木狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值