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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 08:33:21