SymPy多变量表达式切片绘图报错:x与y维度不匹配问题
问题:SymPy绘图时维度不匹配错误
我尝试绘制一个含多个变量的表达式,希望为除一个变量外的所有符号指定数值,针对该变量绘制函数曲线。涉及的表达式为:
- 单通道压降:$dP_{single} = -\frac{Q\mu(L_{filter}+L_{cake})}{K_{filter}+K_{cake}}$
- 并联双通道压降:$dP_{parallel} = -\frac{(Q/2)\mu(L_{filter}+L_{cake}/2)}{K_{filter}+K_{cake}}$
我采用以下代码绘图:
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,)
解决方法
错误核心原因:SymPy的subs方法不支持直接传入NumPy数组,当你把长度为200的L_cake数组传入时,subs会将整个数组当作单个符号值处理,最终返回单个结果,导致y轴维度和x轴不匹配。
提供两种修正方案:
方案1:用lambdify转NumPy可调用函数(推荐)
这是效率最高的批量计算方式:
# 先简化得到dP_parallel的表达式 expr = sol2[0].simplify() # 固定已知变量,仅保留L_cake为自变量 expr_fixed = expr.subs({'dP_single':1, 'L_filter':0.005}) # 将SymPy表达式转为NumPy支持的函数 percent_dP_single = smp.lambdify(L_cake, expr_fixed, 'numpy') # 生成数据并绘图 L_cake_vals = np.linspace(0, .01, 200) plt.plot(L_cake_vals, percent_dP_single(L_cake_vals)) plt.xlabel('L_cake') plt.ylabel('dP_parallel / dP_single') plt.show()
方案2:遍历数组逐个计算
如果不想使用lambdify,可以手动遍历数组元素完成替换:
def percent_dP_single(L_cake_arr): res_list = [] for val in L_cake_arr: res_list.append(smp.N(sol2[0].subs({'dP_single':1,'L_cake':val,'L_filter':.005}))) return np.array(res_list) L_cake=np.linspace(0,.01,200) plt.plot(L_cake,percent_dP_single(L_cake)) plt.show()
两种方法都能解决维度不匹配问题,方案1的计算效率更高,适合处理大规模数组。
内容的提问来源于stack exchange,提问作者remusconnor
相关产品推荐
相关产品推荐

