绘制多变量SymPy表达式的切片
我想画一个包含多个变量的表达式。我想给除了一个变量以外的所有符号指定数值,然后根据那个变量来绘制这个函数。
这个表达式在这里展示:

我尝试用这种方法来绘图:
import numpy as np
import sympy as smp
import matplotlib.pyplot as plt
smp.init_printing()
dP_single,dP_parallel, Q,mu,L_filter,L_cake,K_filter,K_cake=smp.symbols('dP_single,dP_parallel, Q,mu,L_filter,L_cake,K_filter,K_cake')
Eq1=smp.Eq((-Q*mu*(L_filter+L_cake)/(K_filter+K_cake))-dP_single,0)
Eq2=smp.Eq((-(Q/2)*mu*(L_filter+(L_cake/2))/(K_filter+K_cake))-dP_parallel,0)
sol=smp.solve([Eq1,Eq2],[dP_single,dP_parallel])
display(sol)
Eq2=smp.Eq((1/4)*(-L_cake*Q*mu-2*L_filter*Q*mu)*dP_single/(-L_cake*Q*mu-L_filter*Q*mu)-dP_parallel,0).simplify()
display(Eq2)
sol2=smp.solve(Eq2,dP_parallel)
display(sol2[0].simplify())
def percent_dP_single(L_cake_):
percent_dPsingle=smp.N(sol2[0].subs({'dP_single':1,'L_cake':L_cake_,'L_filter':.005}))
return percent_dPsingle
L_cake=np.linspace(0,.01,200)
plt.plot(L_cake,percent_dP_single(L_cake))
但是我遇到了以下错误:
x and y must have same first dimension, but have shapes (200,) and (1,)
2 个回答
0
这里有几种选择:
下面是常用的代码:
import numpy as np
import sympy as smp
import matplotlib.pyplot as plt
smp.init_printing()
dP_single,dP_parallel, Q,mu,L_filter,L_cake,K_filter,K_cake=smp.symbols('dP_single,dP_parallel, Q,mu,L_filter,L_cake,K_filter,K_cake')
Eq1=smp.Eq((-Q*mu*(L_filter+L_cake)/(K_filter+K_cake))-dP_single,0)
Eq2=smp.Eq((-(Q/2)*mu*(L_filter+(L_cake/2))/(K_filter+K_cake))-dP_parallel,0)
sol=smp.solve([Eq1,Eq2],[dP_single,dP_parallel])
display(sol)
Eq2=smp.Eq((1/4)*(-L_cake*Q*mu-2*L_filter*Q*mu)*dP_single/(-L_cake*Q*mu-L_filter*Q*mu)-dP_parallel,0).simplify()
display(Eq2)
sol2=smp.solve(Eq2,dP_parallel)
display(sol2[0].simplify())
def percent_dP_single(L_cake_):
percent_dPsingle=smp.N(sol2[0].subs({'dP_single':1,'L_cake':L_cake_,'L_filter':.005}))
return percent_dPsingle
1. 直接使用 Matplotlib。
如果你想画一个符号表达式,最好先把它转换成一个数字函数,然后用 Numpy 来计算。可以看看这个函数 lambdify
:
func = smp.lambdify([dP_single, L_cake, L_filter], sol2[0])
L_cake_num = np.linspace(0,.01,200)
plt.figure()
plt.plot(L_cake_num, func(1, L_cake_num, 0.005))
# note that I provided arguments ordered as specified in the lambdify call
2. 使用 sympy 绘图
在这里,绘图模块会自动完成 lambdify
的步骤。你只需要提供合适的符号表达式就可以了。
因为你知道两个参数的值,可以把它们代入符号表达式,然后让绘图模块来处理剩下的事情:
from sympy import plot
plot(sol2[0].subs({dP_single: 1, L_filter: 0.005}), (L_cake, 0, 0.01))
3. 玩玩小部件
看起来你在调整参数,也许你也想玩玩小部件?这里有一个更高级的 SymPy 绘图模块:
下面的代码需要在 Jupyter notebook 中运行:
from spb import plot
%matplotlib widget
params = {
dP_single: (1, 0, 2), # (default_value, min_value, max_value)
L_filter: (0.005, 0, 0.1)
}
plot(sol2[0], (L_cake, 0, 0.01), params=params)
0
使用NumPy的 vectorize
类,这样你就可以用一个NumPy数组作为参数来调用你的 percent_dP_single
函数(这个函数现在只接受一个单独的数值)。
import numpy as np
import sympy as smp
import matplotlib.pyplot as plt
smp.init_printing()
dP_single,dP_parallel, Q,mu,L_filter,L_cake,K_filter,K_cake=smp.symbols('dP_single,dP_parallel, Q,mu,L_filter,L_cake,K_filter,K_cake')
Eq1=smp.Eq((-Q*mu*(L_filter+L_cake)/(K_filter+K_cake))-dP_single,0)
Eq2=smp.Eq((-(Q/2)*mu*(L_filter+(L_cake/2))/(K_filter+K_cake))-dP_parallel,0)
sol=smp.solve([Eq1,Eq2],[dP_single,dP_parallel])
display(sol)
Eq2=smp.Eq((1/4)*(-L_cake*Q*mu-2*L_filter*Q*mu)*dP_single/(-L_cake*Q*mu-L_filter*Q*mu)-dP_parallel,0).simplify()
display(Eq2)
sol2=smp.solve(Eq2,dP_parallel)
display(sol2[0].simplify())
# add vectorize decorator
@np.vectorize
def percent_dP_single(L_cake_):
percent_dPsingle=smp.N(sol2[0].subs({'dP_single':1,'L_cake':L_cake_,'L_filter':.005}))
return percent_dPsingle
L_cake=np.linspace(0,.01,200)
plt.plot(L_cake,percent_dP_single(L_cake))