You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 22:48:34