使用SymPy绘制带约束方程遇TypeError问题求助
问题描述
需要绘制带约束条件的方程图像,例如:
sin(x)(当x > 1时)3z * cos(x)(当x >= 0且x + z = 1时)
已完成输入字符串到SymPy表达式的转换,代码如下:
import sympy from sympy.parsing.sympy_parser import parse_expr # 其他无关输入处理步骤 # 最终得到方程字符串和约束条件字符串列表 equation = "sin(x)" constraints = ["x > 1"] x = sympy.symbols("x") eq = parse_expr(equation, evaluate= False) constraints = [ parse_expr(cons, evaluate= False) for cons in constraints]
尝试执行sympy.plot_implicit(sympy.And(eq, *constraints))绘图时,触发错误:TypeError: expecting bool or Boolean, not sin(x),需解决该问题。
解决方法
报错核心原因是plot_implicit要求传入布尔型表达式(等式或不等式),但当前传入的eq是普通函数表达式,不满足参数要求。需根据函数维度分情况处理:
1. 单变量函数(如sin(x))
单变量场景下无需使用plot_implicit,直接用sympy.plot结合约束设置绘图区间即可:
import sympy from sympy.parsing.sympy_parser import parse_expr equation = "sin(x)" constraints = ["x > 1"] x = sympy.symbols("x") eq = parse_expr(equation, evaluate=False) constraints = [parse_expr(cons, evaluate=False) for cons in constraints] # 根据约束设置绘图区间,这里取x∈(1,10) p = sympy.plot(eq, (x, 1, 10), show=False) p.show()
若约束更复杂(如多区间限制),可通过Piecewise定义分段函数后绘图:
from sympy import Piecewise # 定义分段逻辑:满足约束时取原函数,否则无定义 piecewise_eq = Piecewise((eq, sympy.And(*constraints)), (None, True)) sympy.plot(piecewise_eq, (x, -5, 10))
2. 多变量函数(如3z*cos(x))
多变量场景需先将表达式转为布尔等式(如y = 3z*cos(x)),再结合约束条件:
import sympy from sympy.parsing.sympy_parser import parse_expr equation = "3*z*cos(x)" constraints = ["x >= 0", "x + z = 1"] x, z, y = sympy.symbols("x z y") eq = parse_expr(equation, evaluate=False) constraints = [parse_expr(cons, evaluate=False) for cons in constraints] # 将函数转为y=eq的等式,再与约束组合 plot_expr = sympy.And(y - eq, *constraints) sympy.plot_implicit(plot_expr, (x, 0, 5), (z, -4, 1))
如果是绘制隐函数(如3z*cos(x)=0),直接将表达式转为等式后结合约束即可:
plot_expr = sympy.And(eq, *constraints) sympy.plot_implicit(plot_expr, (x, 0, 5), (z, -4, 1))
内容的提问来源于stack exchange,提问作者Abdulrahman Itman
相关产品推荐
相关产品推荐

