求解微分方程,列出索引超出范围

时间:2017-03-30 04:57:46

标签: python optimization scipy minimize

def rainflow(pr, dt, ci, k, tabo):
    phi = tabo/dt
    qsim = pd.Series(data=None, index=pr.index)
    qsim.iloc[0] = ci
    for i in range(1, len(qsim) + 1):
        qsim.iloc[i] = k * (pr.iloc[i] - (phi * (qsim.iloc[i-1] / pr.iloc[i-1])))
    return qsim.iloc

def irmse(dif, obs):
    rmse = np.sqrt(np.mean(dif ** 2) / len(obs))
    delta = obs - obs.shift(1)
    delta_prom = np.mean(delta)
    sigma_obs = (np.sqrt((np.sum((delta - delta_prom) ** 2) / (len(delta)) - 1)))
    irmse = rmse / sigma_obs
    return irmse

def obj_fun(par, arg):
    sim = rainflow(arg[1], arg[2], par[0], par[1])
    dif = arg[0] - sim
    return irmse(dif, arg[0])

df_data = pd.ExcelFile('Taller_opt.xlsx').parse(sheetname='caudal', index_col='Fecha')
sr_pr_cal = df_data['PT'].iloc[0:int(len(df_data['PT']) * 0.7)]
sr_pr_val = df_data['PT'].iloc[int(len(df_data['PT']) * 0.7):]
sr_qobs_cal = df_data['Qobs'].iloc[0:int(len(df_data['Qobs']) * 0.7)]
sr_qobs_val = df_data['Qobs'].iloc[int(len(df_data['Qobs']) * 0.7):]

dt = 1.
ci = sr_qobs_cal.iloc[0]

met_opt = 'minimize'

par_ini = [0.5, 10]

min_results = so.minimize(fun=obj_fun, x0=par_ini, args=[sr_pr_cal, sr_qobs_cal], method='Nelder-Mead')

我试图优化我的等式,但它给出了:

File "C:/Users/yeni/PycharmProjects/untitled/new.py", line 23, in obj_fun
sim = rainflow(arg[1], arg[2], par[0], par[1])

IndexError:列表索引超出范围

" IndexError:列表索引超出范围"为什么会这样? 怎么能解决它?

0 个答案:

没有答案