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

SymPy中Function类符号转普通符号及非线性方程组求解问题

解决SymPy求解含函数应用的非线性方程组问题

你遇到的问题核心在于:f(x)、h(x)是**应用函数(AppliedFunction)**对象,而sympy.nonlinsolve要求待求解的未知量是独立的代数符号(Symbol类型)。直接用函数应用作为未知量,SymPy无法正确将其识别为可求解的变量,所以会报错。

下面给你两种可行的解决思路,附带代码示例:

方法一:替换函数应用为普通符号求解

这种方法先把f(x)、h(x)替换成普通符号,解完后再映射回原函数应用,逻辑清晰,适合保留原函数定义的场景:

import sympy

x = sympy.Symbol('x')
f, g, h = sympy.symbols("f g h", cls=sympy.Function)

# 原方程组
eq1 = 2*f(x)*g(x) - h(x)
eq2 = f(x)**2 + h(x)*g(x)

# 1. 定义替代用的普通符号
u = sympy.Symbol('u')  # 代替f(x)
v = sympy.Symbol('v')  # 代替h(x)

# 2. 将方程组中的函数应用替换为普通符号
substituted_eqs = [eq1.subs({f(x): u, h(x): v}), eq2.subs({f(x): u, h(x): v})]

# 3. 求解替换后的方程组
solutions = sympy.nonlinsolve(substituted_eqs, [u, v])

# 4. 将解映射回原函数应用
final_solutions = []
for sol in solutions:
    sol_map = {f(x): sol[0], h(x): sol[1]}
    final_solutions.append(sol_map)

# 输出结果,会得到形如[{f(x): 0, h(x): 0}, {f(x): -2*g(x), h(x): -4*g(x)**2}]的解
print(final_solutions)

方法二:直接将待求函数视为代数变量

如果不需要保留f、h的Function类型定义,也可以直接把f(x)、h(x)当作普通代数变量来处理,代码更简洁:

import sympy

x = sympy.Symbol('x')
# 把已知的g(x)定义为函数应用
g = sympy.Function('g')(x)
# 将f、h直接定义为普通符号(代表f(x)和h(x))
f, h = sympy.symbols('f h')

# 构建方程组
eq1 = 2*f*g - h
eq2 = f**2 + h*g

# 直接求解
solutions = sympy.nonlinsolve([eq1, eq2], [f, h])

# 输出的解就是f(x)和h(x)关于g(x)的表达式
print(solutions)

结果说明

两种方法最终都会得到相同的解:

  • 一组平凡解:f(x)=0,h(x)=0
  • 一组非平凡解:f(x) = -2g(x),h(x) = -4g(x)²

内容的提问来源于stack exchange,提问作者l7ll7

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:38:40