优化算法——全局灵敏度分析算法(PAWN )(Matlab代码实现)

  💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥

目录

1 概述

PAWN 算法简介

相关算法和技术

2 使基于SWAT 的高参数模型的 PAWN 和 Sobol 敏感性分析方法的比较

3 Matlab代码实现


1 概述

大量参数是复杂环境模型的主要问题,因为它限制了它们的应用。因此,旨在识别模型的有影响和无影响参数的敏感性分析 (SA) 方法对于这些模型的有效校准至关重要。 SA 确实允许通过应用因子固定 (FF) 和因子优先级 (FP) 来减少校准过程中涉及的参数数量。在本文中,基于密度的全球敏感性分析 (GSA) 方法 -PAWN- 应用于土壤和水评估工具 (SWAT),这是一种高度参数化的水文模拟器。本研究的目的是将新开发的 PAWN 方法与 Sobol 方法进行比较,Sobol 方法是一种成熟且广泛使用的基于方差的 SA 方法。 PAWN 方法考虑整个模型输出分布来描述输出不确定性,而 Sobol 方法隐含地假设方差是用于此目的的充分指标。为此,使用PAWN和Sobol'方法,选择了比利时Zenne河SWAT模型的26个水量相关参数进行排名。此外,还从收敛性、参数排序结果的相关演变和所需的计算成本等方面对两种 SA 方法进行了评估和比较。

全局灵敏度分析是一种在多个输入变量存在不确定性的复杂系统中,评估这些输入变量变化对系统输出影响的方法。这种分析有助于识别哪些输入因素是最敏感的,即哪些变量的微小变化会导致系统行为的重大改变。全局灵敏度分析算法众多,其中PAWN(Probabilistic Analysis With Numerical Uncertainties)算法是一种较为独特的概率分析方法,专门用于处理含有数值不确定性的问题。

PAWN 算法简介

PAWN(或其变体如PAWN-PT)算法并不是一个广为人知的特定算法名称,至少在科学文献和工程应用中没有像Sobol序列、Morris方法或方差分解这样被广泛讨论和引用。因此,这里我们可能需要澄清或者探讨的是与“全局灵敏度分析”相关的、具有类似目标或机制的算法概念。

如果我们将“PAWN”作为一个假定的或特指的全局灵敏度分析方法来讨论,其核心思想可能包含以下几个方面:

  1. 概率分析:利用概率论和数理统计的方法来处理输入参数的不确定性,通过构建概率模型来描述参数的分布特性。

  2. 数值不确定性处理:直接面对模型中的数值不确定性,这可能涉及到复杂的数值模拟或计算,特别是在那些难以解析求解的系统中。

  3. 全局视角:与只关注局部最优或敏感性分析不同,全局灵敏度分析旨在从整个输入空间的角度来评估参数的重要性,捕捉所有可能的交互效应。

  4. 重要性排序:通过量化指标(如敏感性指数)来排序输入变量,以确定哪些输入对模型输出的影响最大。

相关算法和技术

虽然直接关于“PAWN”算法的具体描述可能较难找到,但以下是一些广泛应用于全局灵敏度分析的著名技术,这些可能涵盖了所谓的“PAWN”想要达到的目标或采用了类似的策略:

  • Sobol敏感性分析:利用ANOVA(分析方差)分解和低阶矩来估计每个输入参数及其交互项对输出变异的贡献。

  • ** Morris筛选法**:一种高效的全局灵敏度分析方法,特别适合于快速识别关键输入参数,通过一系列的输入变化来估计敏感性指标。

  • FAST( Fourier Amplitude Sensitivity Test):利用傅里叶变换来分析模型输入和输出之间的关系,适用于非线性系统的全局敏感性分析。

  • EFAST(Extended Fourier Amplitude Sensitivity Test):FAST方法的一个扩展,能够处理更复杂的模型结构和输入相关性。

2 使基于SWAT 的高参数模型的 PAWN 和 Sobol 敏感性分析方法的比较

部分代码: 

subplot(331); ylabel('y'); hold on;box on;
subplot(334); ylabel('CDF'); hold on;  box on;
subplot(337); ylabel('KS'); hold on; xlabel('x_1'); box on;
subplot(338); xlabel('x_2'); hold on;box on;
subplot(339); xlabel('x_3'); hold on;box on;
for ind=1:length(lb)
    subplot(330+ind)
    plot(par_c(:,ind),y_c, 'xk', 'markersize', 2);
end

crit_c = [1.22,1.36,1.48,1.63,1.73,1.95]; % 0.1, 0.05, 0.025, 0.010, 0.005, 0.001
critval = crit_c(2) * sqrt((Nu+Nc)/(Nu*Nc));

for ind=1:length(lb)
    subplot(333+ind)
    plot([-100, 100], [1, 1], 'k--'); hold on
    plot(ci,ft((ind-1)*n+1:ind*n,:), 'color', [0.8,0.8,0.8]); ylim([0,1]);
    plot(ci,f, 'r:','linewidth',4); ylim([0,1.2])
    hold off
end

colData = linspace(0,n,n)'/n; colData = [colData colData colData];

for ind=1:length(lb)
    subplot(336+ind)
    [xtoplot, indices] = sort(xvals(ind,:));
    ytoplot = KS(ind, :); ytoplot = ytoplot(indices);
    plot([min(xvals(:)), max(xvals(:))], [critval,critval], 'k--'); hold on;
    plot(xtoplot, ytoplot, 'k');
    scatter(xtoplot, ytoplot, [],  colData, 'filled', 'markeredgecolor', 'k'); 
    ylim([0,1])
    hold off
end

subplot(331); ylabel('y'); hold on;box on;
subplot(334); ylabel('CDF'); hold on;  box on;
subplot(337); ylabel('KS'); hold on; xlabel('x_1'); box on;
subplot(338); xlabel('x_2'); hold on;box on;
subplot(339); xlabel('x_3'); hold on;box on;
for ind=1:length(lb)
    subplot(330+ind)
    plot(par_c(:,ind),y_c, 'xk', 'markersize', 2);
end

crit_c = [1.22,1.36,1.48,1.63,1.73,1.95]; % 0.1, 0.05, 0.025, 0.010, 0.005, 0.001
critval = crit_c(2) * sqrt((Nu+Nc)/(Nu*Nc));

for ind=1:length(lb)
    subplot(333+ind)
    plot([-100, 100], [1, 1], 'k--'); hold on
    plot(ci,ft((ind-1)*n+1:ind*n,:), 'color', [0.8,0.8,0.8]); ylim([0,1]);
    plot(ci,f, 'r:','linewidth',4); ylim([0,1.2])
    hold off
end

colData = linspace(0,n,n)'/n; colData = [colData colData colData];

for ind=1:length(lb)
    subplot(336+ind)
    [xtoplot, indices] = sort(xvals(ind,:));
    ytoplot = KS(ind, :); ytoplot = ytoplot(indices);
    plot([min(xvals(:)), max(xvals(:))], [critval,critval], 'k--'); hold on;
    plot(xtoplot, ytoplot, 'k');
    scatter(xtoplot, ytoplot, [],  colData, 'filled', 'markeredgecolor', 'k'); 
    ylim([0,1])
    hold off
end

3 Matlab代码实现

  • 17
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MATLAB中进行灵敏度分析可以使用以下步骤: 1. 首先,定义一个函数或者模型,该函数或模型代表了你要进行灵敏度分析的系统。 2. 使用MATLAB的优化工具箱或者统计工具箱中的函数,如sensitivity和sobolset,来计算灵敏度指标。这些函数可以帮助你计算系统对输入参数的响应程度。 3. 确定你要进行灵敏度分析的参数范围和步长。你可以使用linspace函数来生成一系列等间隔的参数值。 4. 对于每个参数值,调用你定义的函数或模型,并记录系统的输出结果。 5. 分析每个参数值对系统输出结果的影响。你可以使用图表或者统计分析方法来展示和解释结果。 在上述引用和引用中,包含了一些MATLAB代码示例,可以用于进行灵敏度分析。你可以根据你的具体需求和模型的复杂性,选择适合的方法和工具进行灵敏度分析。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [使用matlab进行灵敏性分析(附源代码)](https://blog.csdn.net/qq_45803923/article/details/117091363)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [优化算法——全局灵敏度分析算法PAWN )(Matlab代码实现)](https://blog.csdn.net/2201_75454341/article/details/128096909)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值