使用Python实现克莱姆法则解矩阵时的赋值异常问题排查
克莱姆法则Python函数的矩阵修改问题排查与修复
问题描述
尝试实现基于克莱姆法则求解线性方程组的Python函数(后续用于复数运算),代码如下:
import numpy as np import sympy as smp def crammer(matrix, constants): D = np.linalg.det(matrix) dets = [] dets.append(D) for i in range(0, len(constants[0]), 1): Dv = matrix Dv[:, i:i+1] = constants.T print(Dv) Dd = np.linalg.det(Dv) dets.append(Dd) return dets Mat = np.array([[2, 1,-1], [3, 2, 2], [4,-2, 3]]) Con = np.array([[1,13,9]]) print(crammer(Mat, Con))
运行结果:
[[ 1 1 -1] [13 2 2] [ 9 -2 3]] [[ 1 1 -1] [13 13 2] [ 9 9 3]] [[ 1 1 1] [13 13 13] [ 9 9 9]] [33.000000000000014, 33.000000000000014, 0.0, 0.0]
预期替换后的矩阵应为:
[[ 1 1 -1] [13 2 2] [ 9 -2 3]] [[ 2 1 -1] [ 3 13 2] [ 4 9 3]] [[ 2 2 1] [ 3 2 13] [ 4 -2 9]]
实际循环中原始矩阵被意外修改,导致后续行列式计算错误(Dy应为66、Dz应为99,实际得到0.0)。
问题原因
Numpy数组的赋值操作Dv = matrix是引用传递,并非创建新的数组副本。这意味着Dv和原始matrix指向内存中的同一个数组对象,修改Dv的元素时,原始matrix也会被同步修改。第一次循环修改了第0列后,后续循环使用的已经是被修改过的矩阵,而非初始输入的原始矩阵,最终导致错误结果。
解决方法
在循环内创建原始矩阵的独立副本,确保每次修改的是新数组,不会影响原始矩阵。使用Numpy数组的.copy()方法实现:
修改后的代码:
import numpy as np import sympy as smp def crammer(matrix, constants): D = np.linalg.det(matrix) dets = [] dets.append(D) for i in range(len(constants[0])): # 创建原始矩阵的副本,避免修改原矩阵 Dv = matrix.copy() Dv[:, i:i+1] = constants.T print(Dv) Dd = np.linalg.det(Dv) dets.append(Dd) return dets Mat = np.array([[2, 1,-1], [3, 2, 2], [4,-2, 3]]) Con = np.array([[1,13,9]]) print(crammer(Mat, Con))
运行结果:
[[ 1 1 -1] [13 2 2] [ 9 -2 3]] [[ 2 1 -1] [ 3 13 2] [ 4 9 3]] [[ 2 1 1] [ 3 2 13] [ 4 -2 9]] [33.000000000000014, 33.000000000000014, 66.0, 99.0]
此时行列式结果符合预期:D=33,Dx=33,Dy=66,Dz=99。
内容的提问来源于stack exchange,提问作者Zachariah Loewen
相关产品推荐
相关产品推荐

