【发布时间】: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=0 和 X =[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