SymPy求解两函数交点遇弃用警告、无输出及FiniteSet取值问题
SymPy求函数交点问题修复方案
警告触发原因
你收到的Add/Mul with non-Expr args has been deprecated since SymPy 1.7. Use Expr args instead.警告,根源是直接将solveset返回的FiniteSet(有限集合)类型对象传入subs做替换:
FiniteSet属于集合类型,不是SymPy标准的Expr(表达式)类型,SymPy 1.7版本后禁止表达式与非表达式类型直接参与算术运算、替换等操作,旧兼容逻辑会抛出该警告,高版本下该操作会直接报错,无法得到预期结果。- 你代码中
f, g = sym.Function('f')(x), sym.Function('g')(x)属于冗余代码,下一行立刻对f、g重新赋值为具体多项式,这行可以直接删除,不影响逻辑。
FiniteSet无法下标访问的处理
FiniteSet不支持[0]这类下标取值是刻意设计:数学层面的有限集合本身是无序结构,元素没有固定排列顺序,SymPy为了避免用户依赖不稳定的元素顺序,没有实现索引接口。
不需要写冗余的遍历逻辑,常用的简洁取值方式有两种:
- 转列表/元组:直接用
list(解集合)就能得到包含所有解的列表,如果需要固定顺序,可以按数值排序:sorted_x = sorted(x_sols, key=sym.N),会按解的数值从小到大排列,顺序稳定。 - 取单个解:如果只需要任意一个解,用
next(iter(x_sols))即可,不需要转换整个集合,适合解数量较多的场景。
修正后可运行代码
import sympy as sym x = sym.symbols('x') f = x - 1 g = -2*x + 5 x_sols = sym.solveset(f - g, x) # 转列表并排序保证顺序稳定 x_list = sorted(x_sols, key=sym.N) y_list = [f.subs(x, xi) for xi in x_list] output = ", ".join([f"S({sym.latex(xi)}|{sym.latex(yi)})" for xi, yi in zip(x_list, y_list)]) print(output)
运行后无警告,正常输出交点坐标:S(2|1)
内容的提问来源于stack exchange,提问作者lycaine
相关产品推荐
相关产品推荐

