使用 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)
嘿,我正在尝试使用 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)