首页 > 解决方案 > if else 条件在 python 的 scipy 代码中没有按预期工作

问题描述

我正在定义一个函数,用于在 scipy 的solve_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=0X= [0,0,0,0],我希望if条件得到满足并被if block实施。但是程序正在执行 else 块。我无法理解这个问题。

标签: pythonfunctionif-statement

解决方案


根据 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 or (False and (False)) 我可能从你已经提供的值中看到的最好方法

  • (sw==1 and X[0]>0)等于 False 因为X[0]=0在您的初始条件下

  • 您还没有von提到(X[1]>=von)

但是根据你得到von的结果大于 0。检查并在代码中进行明确的比较。这对未来会有很大帮助。


推荐阅读