使用 sympy.solvers 推导值时出现内存错误

Memory error when derriving a value using sympy.solvers

嘿,我正在尝试使用 sympy.solvers 从几个方程中推导出一个值 'b'。

此处未给出的一些值已从 excel sheet

中导入
R = 0.287
cp = 1
cv = 0.714
kappa = cp/cv
v_r1 = 438.15
p_r1 = 2.264

b = Symbol('b')

for k in range(4):
    T1[k] = T1_c[k] + 273.15
    P2[k] = P1[k]*(epsilon**(kappa))
    T2[k] = T1[k]*(epsilon**(kappa-1))
    a[k] = P3[k]/P2[k]
    P4[k] = P3[k]
    T3[k] = a[k]*T2[k]
    W_i[k] = P_mi[k]*V_s[k]
    wi[k] = W_i[k]/((P1[k]*V1[k])/(R*T1[k]))

w12 = -cv*(T2[0]-T1[0])
w34 = cv*T1[0]*(kappa-1)*(epsilon**(kappa-1))*a[0]*(b-1)
w45 = cv*T1[0]*(((epsilon**(kappa-1))*a[0]*b)-(a[0]*(b**(kappa-1))))
expr1 = w34 + w45 - np.abs(w12) - wi[0]
b1 = solve((w34 + w45 - np.abs(w12) - wi[0]), b, quick=True, warn=True)

这是 运行 代码后收到的错误:

   h.append(f.get((k,), K.zero))

MemoryError

有没有人有任何提示或知道是否可以使用此求解器推导 b?任何信息将不胜感激!!

由于问题有很多未声明的变量,我只是添加了必要的声明和一些随机值以获得更多见解。

我的随机参数给出了 expr1 的表达式,如下所示:

-42730504.6501296*b**0.400560224089636 + 1495543.03214645*b - 428340.625314184

sympy 的解决方案遇到了内存问题。

由于 sympy 试图找到精确的符号解,而我们正在处理不精确的浮点数,更好的策略似乎是尝试用数值方法解决这个问题。 Sympy 有一个函数 lambdify 可以将其表达式转换为可以用数字表示的函数。

fb = lambdify(b, expr1, 'numpy') 将 expr1 转换为函数 fb(x),现在可以像任何普通 python 函数一样调用它。你可以使用它,例如用于绘图以查看它是否有意义,以及它在哪里达到零。

我试过调用scipy的非线性求解器,但他也不喜欢这个方程。 RuntimeWarning: The iteration is not making good progress, as measured by the improvement from the last ten iterations. 但也许这是因为我的随机数没有意义。我建议您尝试使用 scipy 的解决方案,以及其他 nonlinear solvers.

正如@Oscar Benjamin 在评论中提到的,sympy 也有一个数值求解器,确实 给出了一个解,尽管它是一个复数。 (如果您需要复杂的解决方案,文档建议给 nsolve 一个复数作为初始值。)Sympy 的 solve 和 scipy 的 fsolve 只搜索真正有价值的解决方案.

不清楚复数值是否对您要解决的问题有用,我对参数的模拟是否有意义。

from sympy import *
import random

R = 0.287
cp = 1
cv = 0.714
kappa = cp/cv
v_r1 = 438.15
p_r1 = 2.264

b = Symbol('b')

T1 = [None] * 4
T2 = [None] * 4
T3 = [None] * 4
P2 = [None] * 4
P4 = [None] * 4
a = [None] * 4
W_i = [None] * 4
wi = [None] * 4
P1 = [random.random() for _ in range(4)]
P3 = [random.random() for _ in range(4)]
T1_c = [random.random() for _ in range(4)]
P_mi = [random.random() for _ in range(4)]
V1 = [random.random() for _ in range(4)]
V_s = [random.random() for _ in range(4)]

epsilon = 0.0001

for k in range(4):
    T1[k] = T1_c[k] + 273.15
    P2[k] = P1[k]*(epsilon**(kappa))
    T2[k] = T1[k]*(epsilon**(kappa-1))
    a[k] = P3[k]/P2[k]
    P4[k] = P3[k]
    T3[k] = a[k]*T2[k]
    W_i[k] = P_mi[k]*V_s[k]
    wi[k] = W_i[k]/((P1[k]*V1[k])/(R*T1[k]))

w12 = -cv*(T2[0]-T1[0])
w34 = cv*T1[0]*(kappa-1)*(epsilon**(kappa-1))*a[0]*(b-1)
w45 = cv*T1[0]*(((epsilon**(kappa-1))*a[0]*b)-(a[0]*(b**(kappa-1))))
expr1 = w34 + w45 - Abs(w12) - wi[0]
print(expr1)
sol = nsolve(expr1, b, 1)
print(sol)

fb = lambdify(b, expr1, 'numpy')

from scipy.optimize  import fsolve
sol = fsolve(fb, 0)