使用SymPy linsolve求解线性方程组得到EmptySet结果时,如何求解参数m?
解决SymPy linsolve返回EmptySet的问题,求参数m的值
嘿,我来帮你捋清楚这个问题!为啥你的b部分代码返回了EmptySet,以及该怎么正确求出m的值,我给你一步步拆解:
问题根源
你在b部分的代码里,是让linsolve同时求解**四个变量(x,y,z,m)**满足三个方程组,但实际上你想要的是已知x=1、y=2、z=3时,找到能让第三个方程成立的m值。直接把原方程组丢给linsolve解四个变量的话,前两个方程已经对x,y,z有明确约束,和第三个方程联立后没有公共解,所以返回了EmptySet。
正确的两种解法
方法1:直接代入已知值到目标方程求解
既然已经知道x、y、z的具体值,我们可以把它们代入第三个方程,转化为单变量方程求解m:
import sympy x,y,z,m = sympy.symbols('x,y,z,m') # 把x=1,y=2,z=3代入第三个方程 target_eq = x + 3*y + m*z - 4 m_solution = sympy.solve(target_eq.subs({x:1, y:2, z:3}), m) print(m_solution) # 输出: [-1]
方法2:构造只含m的方程组用linsolve求解
把已知的x、y、z值代入所有方程,前两个方程会变成恒等式(0=0),第三个方程变成关于m的方程,再用linsolve求解:
import sympy from sympy.solvers.solveset import linsolve m = sympy.symbols('m') # 代入x=1,y=2,z=3后的方程组 ans2 = linsolve([1+2+3-6, 1-2+2*3-5, 1+3*2 + m*3 -4], m) print(ans2) # 输出: {-1}
补充说明
你之前a部分的代码能得到结果,是因为隐含了m=1的条件,linsolve可以找到满足所有方程的x,y,z,m组合;但b部分你没有把x,y,z的已知值代入方程,而是让求解器同时解四个变量,自然会因为方程组矛盾返回空集。
内容的提问来源于stack exchange,提问作者Junha_Park




