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

在R语言中求解线性方程组遇报错,如何修正代码?

解决R语言中非方阵线性方程组的求解问题

报错原因

你遇到的'a' (3 x 4) must be square错误,是因为R基础包的solve()函数仅支持求解方阵对应的线性方程组(方程数等于未知数个数的情况)。而你的系数矩阵m1是3行4列,属于欠定方程组(4个未知数、3个约束方程),存在无穷多组解,无法直接用solve()处理。

解决方案

方法1:用Moore-Penrose广义逆求特解

借助MASS包的ginv()函数计算矩阵的广义逆,可得到方程组的一个特解:

# 若未安装MASS包,先执行安装命令
# install.packages("MASS")
library(MASS)

m1 <- rbind(c(1,-2,-1,3),
            c(-2,4,5,-5),
            c(3,-6,-6,8))
m2 <- c(0,3,2)

# 计算广义逆并得到特解
x_special <- ginv(m1) %*% m2
x_special

方法2:通过QR分解求通解

欠定方程组的通解为特解 + 齐次方程组基础解系的线性组合,用QR分解可获取齐次解空间:

m1 <- rbind(c(1,-2,-1,3),
            c(-2,4,5,-5),
            c(3,-6,-6,8))
m2 <- c(0,3,2)

# 对系数矩阵做QR分解
qr_result <- qr(m1)
# 求解特解
x_special <- qr.coef(qr_result, m2)
# 获取齐次方程组的基础解系(即m1的零空间)
null_space <- qr.Q(qr_result, complete = TRUE)[,(qr_result$rank+1):ncol(m1)]

# 通解形式:x_special + t1*null_space[,1] + t2*null_space[,2],t1、t2为任意实数
cat("特解:\n")
print(x_special)
cat("\n齐次方程组基础解系:\n")
print(null_space)

方法3:用lsfit()求最小二乘解(兼容无解场景)

如果方程组可能无解(超定情况),lsfit()可返回最小二乘意义下的解,欠定方程组也能得到其中一个有效解:

m1 <- rbind(c(1,-2,-1,3),
            c(-2,4,5,-5),
            c(3,-6,-6,8))
m2 <- c(0,3,2)

fit_result <- lsfit(m1, m2, intercept = FALSE)
fit_result$coefficients

内容的提问来源于stack exchange,提问作者Peng Guo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 20:35:27