sobol敏感性分析 matlab代码
生活随笔
收集整理的這篇文章主要介紹了
sobol敏感性分析 matlab代码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
% sobol 參數敏感性分析
%參考:
% csdn : https://blog.csdn.net/xiaosebi1111/article/details/46517409
% wiki: https://en.wikipedia.org/wiki/Variance-based_sensitivity_analysis
%運行環境 matlab2016b%% 初始化
clc;
clear all;
close all;
%% 設定:給定參數個數和各個參數的范圍
D=3;% 維度3,幾個參數
M=D*2;%
nPop=4;% 采樣點個數,也就是參數水平數 ,取大了好,比如4000,但慢
VarMin=[0 0 0 ];%各個參數下限
VarMax=[1 1 1];%各個參數上限
%% 產生所需的各水平參數
VarMin=[VarMin,VarMin];
VarMax=[VarMax,VarMax];
p= sobolset(M);% https://www.cnblogs.com/zhubinglong/p/12260292.html
% R=p(1:nPop,:);% 我只用前nPop個
R=[];
for i=1:nPopr=p(i,:);r=VarMin+r.*(VarMax-VarMin);R=[R; r];
end
% plot(R(:,1),'b*')
% 拆分為A B
A=R(:,1:D);% 每行代表一組參數,其中每列代表每組參數的一個參數;行數就代表共有幾組參數
B=R(:,D+1:end);
% 根據A B 產生矩陣AB
AB=zeros(nPop,D,D);
for i=1:DtempA=A;tempA(:,i)=B(:,i);AB(1:nPop,1:D,i)=tempA;
end
%% 求各參數解
YA=zeros(nPop,1);% 解
YB=zeros(nPop,1);
YAB=zeros(nPop,D);%分別代表YAB1,YAB2,YAB3,YAB(:,D)就代表YABD
for i=1:nPopYA(i)=myfun(A(i,:));YB(i)=myfun(B(i,:));for j=1:DYAB(i,j)=myfun(AB(i,:,j));end
end
%% 根據一階影響指數公式:
VarX=zeros(D,1);% S的分子
S=zeros(D,1);% 0: 估算基于給定樣本的方差(EXCEL var.p) ; 1:計算基于給定的樣本總體的方差(EXCEL var.p())
% var([2.091363878 1.110366059 3.507651769 1.310950363 2.091363878 3.507651769 1.110366059 1.7066512],1);
VarY=var([YA;YB],1);% S的分母。 計算基于給定的樣本總體的方差(EXCEL var.p())
for i=1:Dfor j=1:nPopVarX(i)=VarX(i)+YB(j)*(YAB(j,i)-YA(j));endVarX(i)=1/nPop*VarX(i);S(i)=VarX(i)/VarY;
end%% 總效應指數
EX=zeros(D,1);
ST=zeros(D,1);
for i=1:Dfor j=1:nPopEX(i)=EX(i)+(YA(j)-YAB(j,i))^2;endEX(i)=1/(2*nPop)* EX(i);ST(i)=EX(i)/VarY;
end
disp('一階影響指數:S');
disp(S);
disp('總效應指數:ST');
disp(ST);
disp('success!');%% 子函數 matlab2016之前不支持子函數寫在同一個m文檔中
function y=myfun(x)
y=sin(x(1))+7*(sin(x(2)))^2+0.1*x(3)^4*sin(x(1));
end
?
總結
以上是生活随笔為你收集整理的sobol敏感性分析 matlab代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自动微分(Automatic Diffe
- 下一篇: matlab人脸追踪,求大神帮助我这个菜