关于使用Z3Py online解决运输问题的问题

关于使用Z3Py online解决运输问题的问题,z3,Z3,使用以下代码解决了运输现象中的某些问题: T_max, T_0, S, R, k, I, k_e, L, R, E, a = Reals('T_max T_0 S R k I k_e L R E a') k = a*k_e*T_0 I = k_e*E/L S = (I**2)/k_e eq = T_0 + S* R**2/(4*k) print eq equations = [ T_max == eq, ] print "Temperature equations:" print equatio

使用以下代码解决了运输现象中的某些问题:

T_max, T_0, S, R, k, I, k_e, L, R, E, a = Reals('T_max T_0 S R k I k_e L R E a')
k = a*k_e*T_0
I = k_e*E/L
S = (I**2)/k_e
eq = T_0 + S* R**2/(4*k)
print eq
equations = [
T_max == eq,
]
print "Temperature equations:"
print equations
problem = [
R == 2, L == 5000,
T_0 == 20 + 273,
T_max   == 30 + 273, k_e == 1,
a == 2.23*10**(-8), E > 0
]
print "Problem:"
print problem 
print "Solution:"
solve(equations + problem)
通过在线使用此代码,我们可以获得

这个输出给出了正确的答案,但代码中有两个问题:a名为eq的表达式没有完全简化,因此有必要为k_e提供任意值。我的问题是:如何简化表达式eq,从而从eq中消除k_e

其他示例:确定管的半径

代码:

输出:

Fluid equations:
[-((P_0 - P_1)/(2·mu·L))·(R2/2 - 0) + C = 0, q =
3927/625·
(-(((P_0 - P_1)/(2·mu·L))/2)·(R4/4 - 0) + C·(R2/2 - 0))]
Problem:
[L = 2501/5000, mu = 403/10000000, P_0 = 482900, P_1 = 0, q = 2997/1000000, R > 0]
Solution:
[R = 0.0007512843?,
q = 2997/1000000,
P_1 = 0,
P_0 = 482900,
mu = 403/10000000,
L = 2501/5000,
C = 3380.3149444289?]

也许你想约束k_e!=0表示k_e==1?这将减少对可以产生的解决方案集的限制。然而,当用这个修改过的问题运行Z3时,我得到赋值k_e==1。如果还添加了约束k_e!=Z3确实找到了一个不同的解决方案。非常感谢您的建议,但是如果名为eq的表达式被完全简化,参数K_e就不会出现。你知道如何进行这样的完全简化吗?Juan,在Z3中,只有当x!=0而且,即使我们断言x!=0时,当前公式简化器不会将x/x替换为1。同样,它不会取消k_e^2 L^2/k_e中的k_e。注意,Z3中使用的过程不是基于完全简化或简单代数简化。simplifier只是基于完全不同技术的真实解算器的预处理器。非常感谢您的解释,在所有情况下Z3都很棒。
Fluid equations:
[-((P_0 - P_1)/(2·mu·L))·(R2/2 - 0) + C = 0, q =
3927/625·
(-(((P_0 - P_1)/(2·mu·L))/2)·(R4/4 - 0) + C·(R2/2 - 0))]
Problem:
[L = 2501/5000, mu = 403/10000000, P_0 = 482900, P_1 = 0, q = 2997/1000000, R > 0]
Solution:
[R = 0.0007512843?,
q = 2997/1000000,
P_1 = 0,
P_0 = 482900,
mu = 403/10000000,
L = 2501/5000,
C = 3380.3149444289?]