使用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)
补充说明
- 若需要复数解,直接去掉代码中的实数判断逻辑即可,SymPy会处理复数平方根的情况。
- 原代码未指定
x的取值,这是关键遗漏点——Wolfram|Alpha默认会假设x为0或其他默认值,你必须明确x的取值才能得到具体的数值解。
内容的提问来源于stack exchange,提问作者user20844327
相关产品推荐
相关产品推荐

