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