zoukankan      html  css  js  c++  java
  • MATLAB 实现sobol参数敏感性分析

     1 % sobol 参数敏感性分析
     2 %参考:
     3 % csdn : https://blog.csdn.net/xiaosebi1111/article/details/46517409
     4 % wiki: https://en.wikipedia.org/wiki/Variance-based_sensitivity_analysis
     5 %运行环境 matlab2016b
     6 %作者 blzhu@buaa.edu.cn 2020年6月7日
     7 %% 初始化
     8 clc;
     9 clear all;
    10 close all;
    11 %% 设定:给定参数个数和各个参数的范围
    12 D=3;% 维度3,几个参数
    13 M=D*2;% 
    14 nPop=4;% 采样点个数,也就是参数水平数 ,取大了好,比如4000,但慢
    15 VarMin=[0 0 0 ];%各个参数下限
    16 VarMax=[1 1 1];%各个参数上限
    17 %% 产生所需的各水平参数
    18 VarMin=[VarMin,VarMin];
    19 VarMax=[VarMax,VarMax];
    20 p= sobolset(M);% https://www.cnblogs.com/zhubinglong/p/12260292.html
    21 % R=p(1:nPop,:);% 我只用前nPop个
    22 R=[];
    23 for i=1:nPop
    24     r=p(i,:);
    25     r=VarMin+r.*(VarMax-VarMin);
    26     R=[R; r];
    27 end
    28 % plot(R(:,1),'b*')
    29 % 拆分为A B
    30 A=R(:,1:D);% 每行代表一组参数,其中每列代表每组参数的一个参数;行数就代表共有几组参数
    31 B=R(:,D+1:end);
    32 % 根据A B 产生矩阵AB
    33 AB=zeros(nPop,D,D);
    34 for i=1:D
    35     tempA=A;
    36     tempA(:,i)=B(:,i);
    37     AB(1:nPop,1:D,i)=tempA;
    38 end
    39 %% 求各参数解
    40 YA=zeros(nPop,1);%41 YB=zeros(nPop,1);
    42 YAB=zeros(nPop,D);%分别代表YAB1,YAB2,YAB3,YAB(:,D)就代表YABD
    43 for i=1:nPop
    44     YA(i)=myfun(A(i,:));
    45     YB(i)=myfun(B(i,:));
    46     for j=1:D
    47         YAB(i,j)=myfun(AB(i,:,j));
    48     end
    49 end
    50 %%  根据一阶影响指数公式:
    51 VarX=zeros(D,1);% S的分子
    52 S=zeros(D,1);
    53 
    54 % 0: 估算基于给定样本的方差(EXCEL var.p) ;   1:计算基于给定的样本总体的方差(EXCEL var.p())
    55 % var([2.091363878    1.110366059    3.507651769    1.310950363    2.091363878    3.507651769    1.110366059    1.7066512],1);
    56 VarY=var([YA;YB],1);% S的分母。 计算基于给定的样本总体的方差(EXCEL var.p())
    57 for i=1:D
    58     for j=1:nPop
    59          VarX(i)=VarX(i)+YB(j)*(YAB(j,i)-YA(j));
    60     end
    61      VarX(i)=1/nPop*VarX(i);
    62      S(i)=VarX(i)/VarY;
    63 end
    64 
    65 %% 总效应指数
    66 EX=zeros(D,1);
    67 ST=zeros(D,1);
    68 for i=1:D
    69     for j=1:nPop
    70          EX(i)=EX(i)+(YA(j)-YAB(j,i))^2;
    71     end
    72       EX(i)=1/(2*nPop)* EX(i);
    73      ST(i)=EX(i)/VarY;
    74 end
    75 disp('一阶影响指数:S');
    76 disp(S);
    77 disp('总效应指数:ST');
    78 disp(ST);
    79 disp('success!');
    80 
    81 
    82 %% 子函数 matlab2016之前不支持子函数写在同一个m文档中
    83 function y=myfun(x)
    84 y=sin(x(1))+7*(sin(x(2)))^2+0.1*x(3)^4*sin(x(1));
    85 end
  • 相关阅读:
    c语言中while((c=getchar())!=EOF)怎样才能输入EOF是循环中断
    Python学习笔记之装饰器原理
    Ubuntu中使用pip3报错
    Django配置xadmin后台模板之坑(一)
    ES6之字符串扩展
    Koa中设置中文Cookie值
    node中中间件body-parser的实现方式
    CSS笔记之Grid网格系统
    从0开始搭建vue+webpack脚手架(四)
    从0开始搭建vue+webpack脚手架(三)
  • 原文地址:https://www.cnblogs.com/zhubinglong/p/13063117.html
Copyright © 2011-2022 走看看