отсутствует 1 обязательный позиционный аргумент: 'dictVar' Python - PullRequest
0 голосов
/ 13 января 2020

Я программист начального уровня в Python. Я использую функцию odeint для решения системы обыкновенных дифференциальных уравнений. Я строю библиотеку структуры уравнений (словарь), которая содержит переменные (a, b, c), тригонометрические c функции (sin, cos, tan) и арифметические c операторы (+ и -), а затем позже пытаясь оптимизировать его с помощью алгоритма разведки роя. Я просто упоминаю ту часть кода, где я получаю сообщение об ошибке. Я посмотрел на некоторые из решенных вопросов той же ошибки, но не помог мне исправить мою ошибку, или, возможно, я не получаю решение именно для моей проблемы. Заранее спасибо

dictVar = {'a':0, 'b': 1, 'c': 2}
ops = { "+": operator.add, "-": operator.sub }
t_range = arange(0.0,60.0,1.0)


def odeFunc(Y, t,z, x,dictVar):

    if x[-3] == 192:
        temp1 = 191
    else:
        temp1 = int(x[-3])
    if x[-2] == 192:
        temp2 = 191
    else:
        temp2 = int(x[-2])
    if x[-1] == 192:
        temp3 = 191
    else:
        temp3 = int(x[-1])
    modelOne = modelsOne[temp1]
    modelTwo = modelsTwo[temp2]
    modelThree = modelsThree[temp3]
    return GenModel(Y, x,z, modelOne,modelTwo,modelThree, dictVar)


def GenModel(Y,x,z,modelOne,modelTwo,modelThree, dictVar):
    dydt = zeros_like(Y)
    dydt[0] = ops[modelOne[0]](dydt[0],x[0]*z[0]*Y[0])
    dydt[0] = ops[modelOne[1]](dydt[0],x[1]*z[1]*Y[dictVar[modelOne[-3]]])
    dydt[0] = ops[modelOne[2]](dydt[0],x[2]*z[2]*Y[dictVar[modelOne[-2]]]*Y[dictVar[modelOne[-1]]])
    dydt[0] = ops[modelOne[3]](dydt[0],x[3]*z[3])

    dydt[1] = ops[modelTwo[0]](dydt[1],x[4]*z[0]*Y[1])
    dydt[1] = ops[modelTwo[1]](dydt[1],x[5]*z[1]*Y[dictVar[modelTwo[-3]]])
    dydt[1] = ops[modelTwo[2]](dydt[1],x[6]*z[2]*Y[dictVar[modelTwo[-2]]]*Y[dictVar[modelTwo[-1]]])
    dydt[1] = ops[modelTwo[3]](dydt[1],x[7]*z[3])

    dydt[2] = ops[modelThree[0]](dydt[2],x[8]*z[0]*Y[2])
    dydt[2] = ops[modelThree[1]](dydt[2],x[9]*z[1]*Y[dictVar[modelThree[-3]]])
    dydt[2] = ops[modelThree[2]](dydt[2],x[10]*z[2]*Y[dictVar[modelThree[-2]]]*Y[dictVar[modelThree[-1]]])
    dydt[2] = ops[modelThree[3]](dydt[2],x[11]*z[3])

    return dydt
#Equations
def pendulum_equations(w, t):
    T, I, V = w
    dT = 80 - 0.15*T*sin(T) - 0.00002*T*V
    dI = 0.00002*T*V - 0.55*I*cos(T)
    dV = 900*0.55*I - 5.5*V - 0.00002*T*V*tan(V)
    return  dT, dI, dV

result_init = odeint(pendulum_equations, initial_condi, t_range)

# Calculating Sum of Square Error here
def myfunc(xRand):
    result_new = odeint(odeFunc, initial_condi, t_range, args=(xRand,dictVar))
    result_sub = result_new - result_init
    return sum(result_sub*result_sub)

Ошибка, которую я получаю

TypeError: odeFunc() missing 1 required positional argument: 'dictVar'

1 Ответ

0 голосов
/ 15 января 2020

Вам нужно обращаться с дополнительными аргументами как с одним кортежем внутри вашего odeFun c

dictVar = {'a':0, 'b': 1, 'c': 2}
ops = { "+": operator.add, "-": operator.sub }
t_range = arange(0.0,60.0,1.0)


def odeFunc(Y, t,z, args):
    x,dictVar = args
    if x[-3] == 192:
        temp1 = 191
    else:
        temp1 = int(x[-3])
    if x[-2] == 192:
        temp2 = 191
    else:
        temp2 = int(x[-2])
    if x[-1] == 192:
        temp3 = 191
    else:
        temp3 = int(x[-1])
    modelOne = modelsOne[temp1]
    modelTwo = modelsTwo[temp2]
    modelThree = modelsThree[temp3]
    return GenModel(Y, x,z, modelOne,modelTwo,modelThree, dictVar)


def GenModel(Y,x,z,modelOne,modelTwo,modelThree, dictVar):
    dydt = zeros_like(Y)
    dydt[0] = ops[modelOne[0]](dydt[0],x[0]*z[0]*Y[0])
    dydt[0] = ops[modelOne[1]](dydt[0],x[1]*z[1]*Y[dictVar[modelOne[-3]]])
    dydt[0] = ops[modelOne[2]](dydt[0],x[2]*z[2]*Y[dictVar[modelOne[-2]]]*Y[dictVar[modelOne[-1]]])
    dydt[0] = ops[modelOne[3]](dydt[0],x[3]*z[3])

    dydt[1] = ops[modelTwo[0]](dydt[1],x[4]*z[0]*Y[1])
    dydt[1] = ops[modelTwo[1]](dydt[1],x[5]*z[1]*Y[dictVar[modelTwo[-3]]])
    dydt[1] = ops[modelTwo[2]](dydt[1],x[6]*z[2]*Y[dictVar[modelTwo[-2]]]*Y[dictVar[modelTwo[-1]]])
    dydt[1] = ops[modelTwo[3]](dydt[1],x[7]*z[3])

    dydt[2] = ops[modelThree[0]](dydt[2],x[8]*z[0]*Y[2])
    dydt[2] = ops[modelThree[1]](dydt[2],x[9]*z[1]*Y[dictVar[modelThree[-3]]])
    dydt[2] = ops[modelThree[2]](dydt[2],x[10]*z[2]*Y[dictVar[modelThree[-2]]]*Y[dictVar[modelThree[-1]]])
    dydt[2] = ops[modelThree[3]](dydt[2],x[11]*z[3])

    return dydt
#Equations
def pendulum_equations(w, t):
    T, I, V = w
    dT = 80 - 0.15*T*sin(T) - 0.00002*T*V
    dI = 0.00002*T*V - 0.55*I*cos(T)
    dV = 900*0.55*I - 5.5*V - 0.00002*T*V*tan(V)
    return  dT, dI, dV

result_init = odeint(pendulum_equations, initial_condi, t_range)

# Calculating Sum of Square Error here
def myfunc(xRand):
    result_new = odeint(odeFunc, initial_condi, t_range, args=(xRand,dictVar))
    result_sub = result_new - result_init
    return sum(result_sub*result_sub)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...