Поддерживает ли пакет SAlib (анализ чувствительности) только один столбец (вектор)? - PullRequest
1 голос
/ 11 апреля 2019

Форма выходного массива моей модели, которую я предполагаю использовать в качестве аргумента для анализа SAlib (SOBOL), не соответствует форме массива, в которой нуждается sobol.

  1. У меня есть массив параметров, имеющий форму (28,13), который создается функцией saltelli пакета SAlib.
  2. С другой стороны, моя модель вычисляет решение во многих временных точках, скажем, 200. В итоге у меня есть выходной массив (28,200)
  3. Я должен использовать этот выходной массив какаргумент для функции Соболя Соблиба.
  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 голосов
/ 20 апреля 2019

С SAlib я не смог провести анализ чувствительности к выводу временных рядов моей модели, которая представляла собой массив (28 200). Вместо этого я попробовал 2 разных способа.

1-й: Я сделал SA для каждого момента времени, чтобы я мог график изменения чувствительности параметра во время работы модели. И также я вычислил среднее значение показателей чувствительности, таким образом, я получил окончательный показатель SA.

2-й: я вычислил среднее значение для каждого временного ряда и сделал SA для этих окончательных средних значений.

(1-й вариант закончился с более разумными решениями)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...