【问题标题】:if else condition not working as expected in python's scipy codeif else 条件在 python 的 scipy 代码中没有按预期工作
【发布时间】:2020-04-29 09:18:15
【问题描述】:

我正在定义一个函数,用于在 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 块。我无法理解这个问题。

【问题讨论】:

  • 运算符优先级使您的布尔表达式等效于sw==0 and (X[1]>=von or (sw==1 and X[0]>0))。那是你想要的吗
  • 是的,我只想要这样。
  • 如果您在 math.SE 或 scicomp.SE 中讨论了您想要解决的问题的数学方面以及如何围绕它构建算法,这可能会有所帮助。您期望连续解决方案的状态变量实际上是什么?基础切换将使X 不连续,而“解耦”Z 在相位变化中是连续的。由于特征分解中的顺序不是“自然的”,它是一种设计选择并且可能是随机的,所以Z 应该是连续的没有内在原因。
  • 但从技术上讲,对于第一个条件,if 条件应该得到实现。所有状态变量都应该只切换一次,即在最后一个时间步。我无权访问 math.SE
  • @LutzLehmann,我想我的问题已被删除。欧拉代码在这里stackoverflow.com/questions/61501213/…

标签: python function if-statement


【解决方案1】:

根据 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 在您的初始条件中

  • 你在(X[1]>=von)中没有提到von的值是什么

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

【讨论】:

  • 我只编辑了问题 .von=0。这段代码仍然返回错误的结果
  • 你试过调试吗?我正在使用 pcharm 并通过在 if 语句行中放置断点,我可以检查所有变量的状态以检查它们的值。这很有帮助。看起来 X 包含不为零的东西。如果您对调试不够熟悉,只需在 if 语句之前添加一行 print(sw,X[1],von ,sw, X[0]) 即可。这是一个肮脏的伎俩,但可能会提供快速帮助。
猜你喜欢
  • 2022-10-06
  • 1970-01-01
  • 1970-01-01
  • 2020-11-28
  • 2020-07-26
  • 2022-11-20
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
相关资源
最近更新 更多