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

使用SymPy求解方程仅得2个解,如何获取Wolfram|Alpha的4个解?

问题描述

我尝试使用SymPy求解以下方程,代码如下:

import numpy as np 
import sympy as sp
from sympy import *
mu = 0
sigma = 1
n = 5

v_mu, v_sigma, v_n = mu, sigma, n
mu, sigma, x, s, n = symbols("mu sigma x s n")
eq =n*log((s**2+(x-mu)**2)/sigma**2)+n-(n*s**2+n*(x-mu)**2)/sigma**2 +2
resp = solve(eq, s)
s1, s2 = solve(eq, s)

s1 = s1.subs({mu: v_mu, sigma: v_sigma, n: v_n})
s2 = s2.subs({mu: v_mu, sigma: v_sigma, n: v_n})
resp, s1.evalf(),s2.evalf()

不过我仅得到2个解,但使用Wolfram|Alpha求解该方程得到了4个解。我知道SymPy存在一些局限性,但有没有其他方法可以获取这4个解?我遗漏了什么?


原因分析

SymPy的solve默认会将解简化为关于s²的形式,不会自动展开正负根。你的方程中s始终以s²的形式出现,所以每个s²的正实数解对应两个s的解(正负平方根),这就是Wolfram能输出4个解的核心原因。

解决代码

通过变量替换先求解s²,再推导所有s的解:

import sympy as sp

# 初始化参数
mu_val = 0
sigma_val = 1
n_val = 5
x_val = 0  # 需明确x的取值,Wolfram默认可能用了0

# 定义符号
mu, sigma, x, s, n, t = sp.symbols("mu sigma x s n t")

# 原方程
eq = n * sp.log((s**2 + (x - mu)**2)/sigma**2) + n - (n*s**2 + n*(x - mu)**2)/sigma**2 + 2

# 替换变量:令t = s²
eq_sub = eq.subs(s**2, t)

# 求解t的代数解
t_solutions = sp.solve(eq_sub, t)

# 代入参数值得到具体的t解
t_eval = [sol.subs({mu: mu_val, sigma: sigma_val, n: n_val, x: x_val}) for sol in t_solutions]

# 生成所有s的解(正负根)
s_all_solutions = []
for t_sol in t_eval:
    # 过滤正实数t(如果需要复数解可删除此判断)
    if sp.im(t_sol) == 0 and sp.re(t_sol) > 0:
        s_pos = sp.sqrt(t_sol)
        s_neg = -sp.sqrt(t_sol)
        s_all_solutions.extend([s_pos.evalf(), s_neg.evalf()])

print("所有s的解:", s_all_solutions)

补充说明

  1. 若需要复数解,直接去掉代码中的实数判断逻辑即可,SymPy会处理复数平方根的情况。
  2. 原代码未指定x的取值,这是关键遗漏点——Wolfram|Alpha默认会假设x为0或其他默认值,你必须明确x的取值才能得到具体的数值解。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 03:50:28