【发布时间】:2021-07-07 00:05:43
【问题描述】:
我正在 Python 中执行敏感性分析,并希望生成散点图来显示我的系统的结果。我一直在使用np.linspace(0,100,100) 获得结果,但我想增加我成为np.linspace(0,1000,100) 的时间,以便在散点图中看到更多结果。由于某些未知原因,当我增加时间间隔时,我的系统不会评估(即使时间不应该有所作为)。一路上我还得到了一个RuntimeWarning: overflow encountered in double_scalars return 1+((10*(A^n))/((A^n)+1))(这可能是除以零或无穷大),但我不确定它在哪里崩溃以及从哪里崩溃。我已经尝试将参数范围更改为非常小的灵敏度分析,但遗憾的是没有任何东西可以消除此错误。
这是我的代码:
from scipy import integrate as sp
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import solve_ivp
%matplotlib inline
fig = plt.figure(figsize=(20,10))
def H(A):
if A<0:
return 0
else:
return 1+((10*(A**n))/((A**n)+1))
def Hill(A):
if A<0:
return 0
else:
return (A**n)/((A**n)+1)
def NDMsignals(time,Z,iota,upsilon,vartheta,varphi1,varphi2):
dZdt = [(H(Z[0])*iota)-(upsilon*Z[0])+(Z[1]*varphi1), #A1
(H(Z[1])*vartheta)-(upsilon*Z[1])+(Z[0]*varphi2)] #A2
return dZdt
def main(iota,upsilon,vartheta,varphi1,varphi2):
alpha1 = 0.1
alpha2 = 0.1
gamma = 0.75
n=2.2
d1 = 1.0
d2 = 1.0
beta1 = 10*alpha1
beta2 = 10*alpha2
mu1 = 6.0
mu2 = 6.0
Upsilon1 = 1.0
Upsilon2 = 1.0
c1not = 1.0
c2not = 1.0
b1 = 1.0
b2 = 1.0
k1 = 0.4
k2 = 0.4
sigma1 = 1.0
sigma2 = 1.0
tau1 = 0.75
tau2 = 0.75
time=np.linspace(0,1000,100)
Zinitial = [0.1, 0.1]
# Dimensional Parameters
u = (gamma+b1+b2)
psi = (tau1/tau2)
c1eq = (sigma1*k1)/(mu1-k1)
c2eq = (sigma2*k2)/(mu2-k2)
xeq = (Upsilon1/k1)*((d1*(c1not-c1eq))-(d2*c1eq)+(d2*c2eq))
yeq = (Upsilon2/k2)*((d1*(c2not-c2eq))-(d2*c2eq)+(d2*c1eq))
# NDM Parameters
#iota = (xeq)/(tau1)
#upsilon = (u/alpha1)
#vartheta = (alpha2*yeq)/(alpha1*tau2)
#varphi1 = (b1/(psi*alpha1))
#varphi2 = ((b1*psi)/alpha1)
sol = solve_ivp(lambda t, Z: NDMsignals(time,Z,iota,upsilon,vartheta,varphi1,varphi2),
[time[0],time[-1]], Zinitial, method='BDF', t_eval=time)
#print([sol.y[0][-1], sol.y[1][-1]])
return [sol.y[0][-1], sol.y[1][-1], Hill(sol.y[0][-1]), Hill(sol.y[1][-1])]
# Sensitivity Analysis
from SALib.sample import saltelli
from SALib.analyze import sobol
problem = {
'num_vars': 5,
'names':['iota', 'upsilon', 'vartheta', 'varphi1', 'varphi2'],
'bounds': [[0.01, 10],
[0.01, 35],
[0.01, 10],
[0.01, 3],
[0.01, 3]]
}
param_values = saltelli.sample(problem, 200)
Y1 = np.zeros([param_values.shape[0]])
Y2 = np.zeros([param_values.shape[0]])
Y3 = np.zeros([param_values.shape[0]])
Y4 = np.zeros([param_values.shape[0]])
for i, X in enumerate(param_values):
xx = main(X[0], X[1], X[2], X[3], X[4])
Y1[i] = xx[0]
Y2[i] = xx[1]
Y3[i] = xx[2]
Y4[i] = xx[3]
#Si1 = sobol.analyze(problem, Y1, print_to_console=True)
#Si2 = sobol.analyze(problem, Y2, print_to_console=True)
#Si3 = sobol.analyze(problem, Y3, print_to_console=True)
#Si4 = sobol.analyze(problem, Y4, print_to_console=True)
plt.scatter(Y3,Y4)
任何帮助都会很棒。谢谢。
【问题讨论】:
-
time=np.linspace(0,1000,100) 创建 100 个值,从值 0 开始直到值 1000。除以零应该可以在带有异常处理的 try catch 块中跟踪。跨度>