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

如何在Sympy中针对指定变量求解非线性方程组

针对指定变量求解非线性方程组的可行思路

1 符号消元求解(你给出的示例用的就是该方案)

  • 适用场景:方程组结构简单、变量规模小,需要得到解析闭式解的场景
  • 核心逻辑:借助符号计算工具自动完成代数消元,跳过手工推导步骤,直接输出目标变量和其他未知量的解析关系
  • 你的示例对应实现:
import sympy as sp
from sympy.solvers import solve

# 声明所有涉及的符号变量
t2, t3, c = sp.symbols('theta_2 theta_3 c')

# 整理方程组为 f(x) = 0 的形式
f1 = 2*sp.cos(t2) - 10*sp.cos(t3) - c
f2 = 2*sp.sin(t2) - 10*sp.sin(t3)

# 指定仅对目标变量c求解,工具会自动消去t2、t3两个无关未知量
solve([f1, f2], c)[c]
  • 输出结果:可以直接得到 c = 2*cos(theta_2) - 10*cos(theta_3),进一步化简还能得到用角度差表示的形式 c = sqrt(104 - 40*cos(theta_2 - theta_3))

2 数值求解

  • 适用场景:方程组高度非线性、无法得到解析解,且已经明确非目标变量的具体取值的场景
  • 核心逻辑:将已知的非目标变量数值代入方程组,把问题简化为仅含目标变量的数值求解问题,用迭代算法得到满足精度要求的数值解
  • Python实现可以用scipy.optimize.root,示例如下:
import numpy as np
from scipy.optimize import root

# 已知非目标变量的取值
t2_val = 0.5
t3_val = 0.2

# 定义方程组残差
def equations(c):
    f1 = 2*np.cos(t2_val) - 10*np.cos(t3_val) - c
    f2 = 2*np.sin(t2_val) - 10*np.sin(t3_val)
    return [f1, f2]

# 给定初始猜测值求解
sol = root(equations, x0=0)
print("c的数值解为:", sol.x[0])

3 手工代数消元(适合简单场景验证结果)

对于结构简单的方程组,可以直接手工做消元推导,比如你的示例可以将两个方程两边分别平方后相加,利用三角函数平方和公式化简,就能直接得到c的解析表达式,结果和符号计算的输出完全一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 19:57:00