我正在使用 gekko 来(尝试)求解方程组。我遇到一个问题,因为我的方程中的一项类型是m.asin(q1.T@q2)/m.sqrt(1-(q1.T@q2)**2)
, where q1
and q2
是 R3 中的单位向量。当它们方向相同时,分子和分母为零。当我解决这个系统时fsolve
我用过一个if
-返回0的语句if q1.T@q2 == 1
,因此永远不会有问题。据我了解这里if
- 陈述很糟糕,因为我们需要方程的微分。我调查了m.if3
一点,并尝试过,但这没有帮助。例如,它引入了松弛变量,导致自由度变为负值,系统无法求解。
有什么想法可以克服 gekko 的 0 比 0 问题吗?
您可以使用m.abs3()
函数通过引入整数变量提供了一种解决方法。该方法比传统的abs方法更适合,因为它是连续可微的,并且避免导致基于梯度的优化器无法收敛。
from gekko import GEKKO
m = GEKKO()
q1 = m.Const(3) # Unit vector in R3
q2 = m.Const(4) # Unit vector in R3
# Using m.abs3() to handle zero over zero issue
asin_term = m.abs3(m.asin(q1.T @ q2) / m.sqrt(1 - q1.T @ q2))
# Add other equations and solve the model
m.Equations([asin_term])
m.solve()
Using m.abs3()
可能会引入额外的整数变量,这可能会增加模型的复杂性。您应该根据您的具体问题和要求,权衡使用此方法和其他替代方法(例如 if 语句)之间的权衡。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)