Есть ли инструмент для анализа влияния переменных
Когда вы пишете программу с большим количеством кода, трудно определить, какие значения оказывают большое влияние на ваш конечный результат. В моем случае у меня есть несколько дифференциальных уравнений, которые я решаю с odeint. Потребовалось бы много времени, чтобы выяснить, какие значения оказывают большое влияние на мой результат (скорость). Есть ли в Python инструмент для анализа ваших ценностей или у кого-то есть идеи?
Спасибо за вашу помощь.
[Редактировать]
MathBio: "В общем, анализ чувствительности - это то, что вы будете делать".
@MathBio Сейчас я прочитал несколько блогов о SALib ( Руководство по SALib) и попытался написать "более простую " тестовую программу для решения дифференциальных уравнений. Ниже вы видите мою написанную программу: я получаю сообщение об ошибке:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python27\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 685, in runfile
execfile(filename, namespace)
File "C:\Python27\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 71, in execfile
exec(compile(scripttext, filename, 'exec'), glob, loc)
File "C:/Users/Tim_s/Desktop/Workspace/test/TrySALib.py", line 44, in <module>
Y = Odefunk(param_values)
File "C:/Users/Tim_s/Desktop/Workspace/test/TrySALib.py", line 24, in Odefunk
dT=odeint(dTdt,T0,t,args=(P,))
File "C:\Python27\lib\site-packages\scipy\integrate\odepack.py", line 148, in odeint
ixpr, mxstep, mxhnil, mxordn, mxords)
File "C:/Users/Tim_s/Desktop/Workspace/test/TrySALib.py", line 17, in dTdt
dT[0]=P[0]*(T[1]-T[0])+P[2]
IndexError: tuple index out of range
Вот код:
from SALib.sample import saltelli
from SALib.analyze import sobol
import numpy as np
from pylab import *
from scipy.integrate import odeint
Tu=20.
t=linspace(0,180,90)
def dTdt(T,t,P):# DGL
dT=zeros(2)
dT[0]=P[0]*(T[1]-T[0])+P[2]
dT[1]=P[1]*(Tu-T[1])+P[0]*(T[0]-T[1])
return dT
T0=[Tu,Tu]
def Odefunk(values):
for P in enumerate(values):
dT=odeint(dTdt,T0,t,args=(P,))
return dT
# Define the model inputs
problem = {
'num_vars': 3,
'names': ['P0', 'P1', 'P2'],
'bounds': [[ 0.1, 0.2],
[ 0.01, 0.02],
[ 0.5, 1]]
}
# Generate samples
param_values = saltelli.sample(problem, 1000, calc_second_order=True)
# Run model (example)
Y = Odefunk(param_values)
# Perform analysis
Si = sobol.analyze(problem, Y, print_to_console=False)
# Print the first-order sensitivity indices
print Si['S1']
1 ответ
Вы действительно должны включить свои оды, чтобы мы могли видеть параметры и начальные условия. Код был бы также хорош.
В общем, анализ чувствительности - это то, что вы будете делать. Выполнение безразмера также является стандартным. Посмотрите эти советы и попробуйте реализовать их, чтобы увидеть, как небольшое изменение параметра повлияет на ваше решение.
Я предлагаю вам взглянуть на эти понятия и включить свой код. Вы должны попробовать первые шаги самостоятельно, и тогда я с радостью помогу с чем-нибудь техническим, когда вы явно приложите усилия. С наилучшими пожеланиями.