使用sympy求解含求和项的方程根返回空列表问题求助
问题原因
- 代码中直接将未求值的
sympy.Sum离散求和对象传入solve函数,SymPy不支持直接求解这种包含求和符号、以求和上限m为变量的隐式方程,因此返回空列表。 - 你定义的
s1是首项为1、公比为a的等比数列前(m-1)项和,可先转换为闭式解析表达式再求解。
解决方法
方法1:先符号求解闭式方程再代入数值
先利用等比数列求和公式把离散求和转换为解析表达式,再调用solve求解:
import sympy m, n, D_star, a = sympy.symbols('m n D_star a', real=True) # 等比数列前(m-1)项和闭式表达式,a≠1时成立 s1 = (a**(m-1) - 1) / (a - 1) rhs = 6 * sympy.sqrt((D_star * (1 + a)*(n - 1))/2) # 求解方程,只保留正实根 solve_res = sympy.solve(s1 - rhs, m, dict=True) m_expr = solve_res[0][m] # 转换为可传入数值的函数 temp = sympy.lambdify((a, n, D_star), m_expr, 'numpy') # 代入参数计算 n_val = 100 a_val = 1.2 D_star_val = 2.0 ms = temp(a_val, n_val, D_star_val) print(ms) # 输出结果:17.06519713880871
方法2:直接数值求解(和Mathematica FindRoot逻辑一致)
不需要提前做符号推导,直接给初始值调用nsolve做数值求解:
import sympy m, n, D_star, a, j = sympy.symbols('m n D_star a j') s1 = sympy.Sum(a**(j-1),(j, 1, m-1)) rhs = 6 * sympy.sqrt((D_star * (1 + a)*(n - 1))/2) # 代入参数后给初始值10求解 expr = s1 - rhs expr_sub = expr.subs({n:100, a:1.2, D_star:2.0}) ms = sympy.nsolve(expr_sub, m, 10) print(ms) # 输出结果:17.0651971388087
内容的提问来源于stack exchange,提问作者richinex
相关产品推荐
相关产品推荐

