【问题标题】:Return Array by func (1) does not match size in Pythonfunc(1)返回的数组与Python中的大小不匹配
【发布时间】:2018-06-24 03:40:09
【问题描述】:

我是 python 新手,所以请多多包涵。我正在使用 Python 中的 odeint 函数求解模型,其中出现 func (1) 返回的数组大小与 y0 (2) 的大小不匹配的错误。 。也许我在返回 odeint 函数中的 args 时犯了一个错误,但我已经看到 odeint LINK 的一篇相关帖子关于股权溢出并且与返回参数一起工作正常。我不知道问题出在哪里,或者我的错误方向可能是错误的。如果我错了,请纠正我。

from scipy import *
from scipy.integrate import odeint
from operator import itemgetter
import matplotlib
matplotlib.use('Agg')
from matplotlib.ticker import FormatStrFormatter
from pylab import *

import sys

ExpData = [1.0 , 1.1660520579009868 , 1.3688685188071037 , 1.6165891026469563 ,
           1.9191557810726714 ]

t_range = arange(0.0,20.0,0.1)

y0 = [1,0.5]
VarList = ["a","b"]
ParaList = ["k1","k2"]
k1 = 1
k2 = 2


def func(Y,t,modelID,t1,t2):
    return GenModel(Y,modelID,t1,t2)

def GenModel(Y,modelID,t1,t2):
    RetY = [None]
    if modelID == 1:
        RetY = Y[0] + Y[1]
    elif modelID == 2:
        RetY = t1*Y[0] + Y[1]
    elif modelID == 3:
        RetY = Y[0] + t1*Y[1]
# code reduced from here

    if Y[0] == 0 or Y[1] == 0:
        if modelID == 27:
            RetY = 0
        elif modelID == 28:
            RetY = 0
    if Y[0] != 0 and Y[1] != 0:
        if modelID == 27:
            RetY = Y[0]*Y[1]
        elif modelID ==28:
            RetY = t1*Y[0]*Y[1]
        elif modelID == 29:
            RetY = t2*Y[0]*Y[1]
           # code reduced from here as well
    return RetY

def EvalModelFitness(Stofloat,ExpData):
    Sum = 0.0
    for i in range(len(Stofloat)):
        Sum += (Stofloat[i]-ExpData[i])**2
    print Sum/len(Stofloat)

if y0[0] == 0 or y0[1] == 0:
    NumModels = 28
else:
    NumModels = 39

for j in range(1,NumModels+1):
    S = odeint(func, y0,t_range,args=(j,k1,k2))
    Stofloat = S[:,0].astype(type('float',(float,),{}))
    EvalModelFitness(Stofloat,ExpData)

【问题讨论】:

  • @Psytho 编辑完成。减少了代码,但我不能进一步减少代码,因为没有人会得到错误。

标签: python python-3.x python-2.7 numpy scipy


【解决方案1】:

首先,您似乎没有在 'func' 函数的任何地方使用 t。

其次,返回值集的长度必须与 Y0 的长度相匹配。在这里,您从 func 返回单个值(1,就像错误状态一样),并且 Y0 的长度为 2(就像错误状态一样)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-07
    • 2019-07-24
    • 2018-07-16
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多