如何用Google Sheets求解非方阵线性方程组以估算任务工时?
解决非方阵场景下的单任务工时估算问题
看起来你卡在了任务数≠天数时的矩阵逆运算报错上,这其实是因为你用的方阵求逆方法只适用于方程数等于未知量数的情况(也就是方阵A),而你的场景是超定方程组(任务数6 > 天数5),这时候MINVERSE会因为矩阵奇异返回#NUM!。
核心问题分析
你的模型是Ax = b,其中:
A是n×m矩阵(n=天数,m=任务数),每行是单日各任务的完成次数b是n×1向量,每行是单日总工时x是m×1向量,对应每个任务的耗时
当m > n时,AᵀA是m×m矩阵,但它的秩最多是n(小于m),属于奇异矩阵,无法求逆,这就是报错的根源。
最优解决方案:最小二乘法(用LINEST函数)
处理超定方程组的标准方法是最小二乘法,它会找到一组x使得Ax与b的误差平方和最小,刚好Google Sheets的LINEST函数内置了这个逻辑,不需要手动计算矩阵转置和求逆。
具体步骤
假设你的「Daily Log」结构是:
- A列:日期(从A4开始)
- B~G列:6项任务的每日完成次数(B4:G8是5天数据)
- H列:每日总工时(H4:H8)
基础用法:直接用
LINEST计算耗时=TRANSPOSE(LINEST(H4:H8, B4:G8, FALSE, FALSE))- 第一个参数
H4:H8:因变量(总工时) - 第二个参数
B4:G8:自变量(各任务完成次数) - 第三个参数
FALSE:不包含截距(符合你的Az+By+…=θ模型,没有固定每日基础工时) TRANSPOSE是为了让结果按任务列的顺序排列(LINEST默认返回逆序)
- 第一个参数
动态适配新增数据:保留你原来的
OFFSET逻辑,让公式自动适应新增的日期或任务=TRANSPOSE(LINEST( OFFSET('Daily Log'!$H$4, 0, 0, COUNTA('Daily Log'!$A:$A)-3, 1), OFFSET('Daily Log'!$B$4, 0, 0, COUNTA('Daily Log'!$A:$A)-3, COUNTA('Daily Log'!$1:$1)-1), FALSE, FALSE ))这个公式会自动识别「Daily Log」里的有效数据行数(减去前3行表头)和任务列数,不用手动调整范围。
补充说明
- 如果出现任务之间线性相关(比如某两个任务总是按固定比例完成),最小二乘解可能不稳定,这时候需要检查任务的相关性,或者合并重复/关联任务。
- 如果你想手动实现最小二乘的矩阵运算(比如学习用),可以用
MOINV函数替代MINVERSE,它能处理奇异矩阵的伪逆:
不过=MMULT(MOINV(MMULT(A_TRANSPOSE, A)), MMULT(A_TRANSPOSE, b))LINEST更简洁高效,推荐直接用它。
内容的提问来源于stack exchange,提问作者Alex




