если условие не работает должным образом в коде scipy python - PullRequest
0 голосов
/ 29 апреля 2020

Я определяю функцию для решения моих дифференциальных уравнений в execute_ivp Сципи.

def conv(t,Z):
    global sw,von,X

    if  X[1]>=von or X[0]>0:
            zdot=LA.inv(v1).dot(A1).dot(v1).dot(Z).reshape(4,1)+LA.inv(v1).dot(B1).dot(U)

            von=0.7
            X=v1.dot(Z)
    else:
            zdot= LA.inv(v0).dot(A0).dot(v0).dot(Z).reshape(4,1)+LA.inv(v0).dot(B0).dot(U)

            X=v0.dot(Z)
    return np.squeeze(np.asarray(zdot)) 

и решение моего уравнения, используя

sw=0
e1,v1=LA.eig(A1)
von=0
Z= np.array([0, 0, 0, 0])
X=v1.dot(Z)
U = np.array([[vin], [vdon]])
Z0= np.array([0, 0, 0, 0])
V=v1
sol = solve_ivp(conv, tspan,Z0,method='Radau')

Первоначально как sw = 0 и X = [0,0,0,0], я ожидаю, что условие if будет выполнено и if block будет реализовано. Но программа выполняет блок else. Я не могу понять проблему.

1 Ответ

0 голосов
/ 29 апреля 2020

Согласно Python Zen N2 «Явное лучше, чем неявное»

def conv(t,Z):
    global sw,von,X

    if sw==0 and (X[1]>=von or (sw==1 and X[0]>0)):
            zdot=LA.inv(v1).dot(A1).dot(v1).dot(Z).reshape(4,1)+LA.inv(v1).dot(B1).dot(U)
            sw=1
            von=0.7
            X=v1.dot(Z)
    else:
            zdot= LA.inv(v0).dot(A0).dot(v0).dot(Z).reshape(4,1)+LA.inv(v0).dot(B0).dot(U)
            sw=0
            X=v0.dot(Z)
    return np.squeeze(np.asarray(zdot)) 

Тогда отладчик - лучший способ выяснить, почему у вас есть True или (False и (False)), которые я вижу из значения, которые вы уже указали, что

  • (sw==1 and X[0]>0) равно False, поскольку X[0]=0 в вашем начальном состоянии

  • Вы не упомянули каково значение von в (X[1]>=von)

Но на основе полученных результатов von больше 0. Проверьте это и сделайте явные сравнения в коде. Это очень поможет в будущем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...