使用SymPy求解简单符号方程时得到空矩阵解的问题
首先得说清楚,你遇到的问题核心是没有给SymPy的solve函数提供一个明确的等式,导致它默认求解的情况根本无解,所以返回了空结果(应该是空列表,不是空矩阵,可能你看错啦)。
为什么你的代码会返回空?
SymPy的solve(expr, var)函数默认行为是求解expr == 0的情况。咱们拆解你的表达式:
((x_max-x_min)/((2**l_x)-1))/precision_x
代入x_max=6、x_min=-6后,分子是6 - (-6) = 12,分母是((2^l_x)-1)*1e8。整个表达式等于0的前提是分子为0,但12永远不可能是0,所以这个方程没有解,solve自然返回空列表[]。
而你测试的solve(x**2 = 4, x)(更规范的写法是solve(Eq(x**2, 4), x)或者solve(x**2 - 4, x))能正常工作,是因为这里明确了一个等式:x²=4,SymPy能找到满足条件的x值。
修正后的代码示例
首先你得明确自己要解的具体等式是什么。比如假设你是想让((x_max-x_min)/((2**l_x)-1))等于precision_x,或者让整个表达式等于1?这里以“让表达式等于1”为例,给你两种可行写法:
写法1:用Eq()构造等式
from sympy import * x = Symbol('x') l_x = Symbol('l_x') x_min = -6 x_max = 6 precision_x = 10**8 # 构造要解的等式:表达式 = 1 target_eq = Eq(((x_max - x_min)/((2**l_x)-1))/precision_x, 1) # 求解l_x solution = solve(target_eq, l_x) print(solution) # 如果需要数值结果,可以用N()转换 print(N(solution[0]))
写法2:整理成等于0的形式
把等式移项,让左边减右边等于0,直接传给solve:
from sympy import * x = Symbol('x') l_x = Symbol('l_x') x_min = -6 x_max = 6 precision_x = 10**8 # 整理为表达式 - 1 = 0 expr = ((x_max - x_min)/((2**l_x)-1))/precision_x - 1 solution = solve(expr, l_x) print(solution)
运行后你会得到类似[log(12/100000000 + 1)/log(2)]的符号解,用N()可以转换成近似数值(大概是-23.07左右,符合预期:因为2-23约等于1e-7,12/(2l_x -1)≈1e8的话,2^l_x≈12/1e8 +1≈1,所以l_x是负数)。
另外注意:你最后写的print(l_x)只是打印符号变量本身,不是求解结果,要打印solution才对哦。
内容的提问来源于stack exchange,提问作者RezAm

