SAlib(灵敏度分析)程序包仅支持一列(矢量)输入吗?

时间:2019-04-11 13:54:24

标签: python-3.x optimization model

我想用作SAlib分析(SOBOL)的参数的模型输出数组的形状与sobol需要的数组的形状不匹配。

  1. 我有一个形状为(28,13)的参数数组,该数组由SAlib包的saltelli函数生成。
  2. 另一方面,我的模型在多个时间点(例如200个)计算一个解决方案。因此,最后我得到的输出数组为(28,200)
  3. 我必须将此输出数组用作SAlib的Sobol函数的参数。
  4. 但是据我从SAlib的文档示例中了解,Sobol的输入参数必须具有列数组,例如(28,)

我想学习的是,由于SAlib的Sobol函数仅需要一个列数组,我是否可以从SAlib的文档中推断出正确的结论?或者我可以用(28,200)的数组喂它吗?

PS:实际上我尝试了(28,200),但出现了一些错误。但是我不确定SAlib是否支持(28,200)的数组形状,或者我的代码是否有错误。

from SALib.sample import saltelli
from SALib.analyze import sobol,morris
from SALib.test_functions import Ishigami  

input_dict = {}
problem = {'num_vars':13,'names': 
['Rp1','Ra','Rv','Rp2','Cla','Csa','Clv','Csv','Emin','Emax','R1','R2','C1'],\
       'bounds':[[1.0,2.0],[0.1,0.5],[0.01,0.1],[11.0,15.0],[0.1,1.5],[0.05,0.55],[30.0,50.0],[2.0,6.0],\
                 [0.001,0.45],[0.2,3.2],[25.0,42.0],[2.0,8.0],[15.0,19.0]]}

param_values = saltelli.sample(problem,1)
for count, param in enumerate(param_values):
    input_dict[count] = param

kwargs = {}
kwargs['newly_defined_parameters']= input_dict

sol_dict = main(**kwargs) # main function solves the model and returns a solution dictionary

我的模型产生8个输出。但是我只想对1个输出进行灵敏度分析。因此,我将这些输出数据加载到my_sol数组中。

my_sol = np.zeros((28,200))
for ps in range(28):         #ps ---> parameter set
    for tp in range(200):    #tp ---> time point
        my_sol[ps][tp]=sol_dict[ps][1][tp] 

my_sol.shape
(28, 200)

现在是分析部分:

Si = sobol.analyze(problem,my_sol)

现在是错误部分:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-39-ab30c1d4df01> in <module>
----> 1 Si = sobol.analyze(problem,my_sol)

C:\ProgramData\Anaconda3\lib\site-packages\SALib\analyze\sobol.py in analyze(problem, Y, calc_second_order, num_resamples, conf_level, print_to_console, parallel, n_processors, seed)
    101 
    102         for j in range(D):
--> 103             S['S1'][j] = first_order(A, AB[:, j], B)
    104             S['S1_conf'][j] = Z * first_order(A[r], AB[r, j], B[r]).std(ddof=1)
105             S['ST'][j] = total_order(A, AB[:, j], B)

ValueError: setting an array element with a sequence.

1 个答案:

答案 0 :(得分:0)

使用SAlib,我无法对模型(28,200)的时间序列输出进行灵敏度分析。 相反,我尝试了2种不同的方式。

1st:我为每个时间点制作了SA,因此我能够绘制模型运行期间参数灵敏度的变化图。而且通过这种方式,我计算出了敏感指数的平均值,从而得出了最终的SA指数。

2nd:我计算了每个时间序列的均值,并为这些最终均值求了SA。

(第一个选项最终得到了更合理的解决方案)

https://github.com/SALib/SALib/issues/233