You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 19:52:53