python - 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
=0
和X
= [0,0,0,0]
,我希望if
条件得到满足并被if block
实施。但是程序正在执行 else 块。我无法理解这个问题。
解决方案
根据 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。检查并在代码中进行明确的比较。这对未来会有很大帮助。
推荐阅读
- c# - 如何计算本地主机和客户端上的玩家分数
- math - 在有限域上实现 FFT
- amazon-web-services - AWS ECS:ECS 服务 Cloudformation 模板中的严重错误
- java - UUID 类型的外键列抛出“原因:org.postgresql.util.PSQLException:错误:列是 uuid 类型,但表达式是 bytea 类型”
- java - 使用 mariaDB 的 Spring-Boot 中的多个数据库
- php - 通过实时服务器在codeigniter中发送邮件
- c# - 根据条件从字典中删除重复值
- asp.net-core - 在 Windows Server 上调用 ASP.NET Core 2.1 Web API 时出现“500 - 内部服务器错误”
- sql-server - 使用 joinsin sql 连接 temptable
- python - Tensorflow 中复杂的切片操作