绘制多变量SymPy表达式的切片

0 投票
2 回答
27 浏览
提问于 2025-04-14 17:55

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

这个表达式在这里展示:

在这里输入图片描述

我尝试用这种方法来绘图:

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))

撰写回答