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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM