结构力学求解器原理:直接刚度法(矩阵位移法)

本页讲清楚平面结构力学求解器背后在算什么、怎么算:从单元刚度矩阵、坐标变换、整体刚度方程组装, 到等效节点荷载、支座约束、支座反力、杆端内力与 N/V/M 内力图、杆端铰静力凝聚与变形曲线插值。 读完这一页,你就知道为什么鼠标画出的刚架能立刻出弯矩图,也能判断结果什么时候可信、什么时候要复核。

1 求解器在算什么

结构静力分析要回答三个问题:结构变形了多少(位移)、支座承受了多大的力(反力)、每根杆件的内力分布(轴力 N、剪力 V、弯矩 M)。 在线求解器把这套计算搬进了浏览器:你在画布上绘制平面梁、刚架、桁架,程序把结构离散成节点和杆件(单元), 用矩阵位移法(直接刚度法)一次性解出全部结果。

它建立在几个经典假定上,和结构力学教材完全一致:线弹性材料(胡克定律)、小变形(几何方程线性化)、 一阶分析(不考虑轴力对弯矩的二阶效应)、杆件为直杆、等截面(Euler–Bernoulli 梁:平截面假定、忽略剪切变形)。

单元的场变量是节点自由度:平面内每个节点 3 个自由度 —— 水平位移 u、竖向位移 v、转角 θ。 一个节点连接若干杆件,结构的总自由度就是 3 × 节点数。

2 五步总览:直接刚度法

“直接刚度法”这个名字来自它的组装方式:把每个单元在自身局部坐标系里的刚度矩阵,逐个“直接”叠加进整体刚度矩阵。整个过程固定为五步:

  1. 单元分析 —— 对每根杆件,在局部坐标系写出 6×6 单元刚度矩阵 k(材料 E、截面 A、I 与长度 L 决定)。
  2. 坐标变换 —— 每根杆件有自己的倾角,用转换矩阵 T 把 k 旋转到整体坐标系:Ke = Tᵀ k T。
  3. 整体组装 —— 按节点自由度编号,把所有 Ke 叠加进整体刚度矩阵 K,荷载叠加成向量 P,得到整体刚度方程 K·D = P。
  4. 引入边界条件 —— 处理支座约束(固端、铰支、辊轴、定向)与支座沉降,划出可自由变形的自由度。
  5. 求解与后处理 —— 解线性方程组得到节点位移 D;再回代求支座反力与每根杆件的杆端力,进而恢复 N/V/M 内力图与变形曲线。

一句话理解:结构像一个由许多弹簧(单元)连成的网络。整体刚度矩阵 K 就是这个网络的“总弹簧系数表”, P 是外力,解出 D 是位移;反力与内力都是位移的子产品。矩阵位移法与手算“位移法”思想相同,只是把查表、列方程、回代全部矩阵化,交给计算机完成。

3 单元分析:单元刚度矩阵

3.1 平面梁单元(6 个自由度)

平面梁单元两端各 3 个自由度,共 6 个。局部坐标系取杆轴为 x′ 轴,局部杆端位移记为 d = [u₁, v₁, θ₁, u₂, v₂, θ₂]ᵀ。把它两端的位移与力联系起来的,就是下面的 6×6 单元刚度矩阵 k(k·d = f),每一行/列对应一个自由度:

ku₁v₁θ₁u₂v₂θ₂
u₁EA/L00−EA/L00
v₁012EI/L³6EI/L²0−12EI/L³6EI/L²
θ₁06EI/L²4EI/L0−6EI/L²2EI/L
u₂−EA/L00EA/L00
v₂0−12EI/L³−6EI/L²012EI/L³−6EI/L²
θ₂06EI/L²2EI/L0−6EI/L²4EI/L

矩阵分四块理解会容易得多:左上/右下是轴向项(EA/L,拉压弹簧);中间 4×4 是弯曲项(12EI/L³、6EI/L²、4EI/L、2EI/L,即“两端同时发生单位竖向位移 / 单位转角所需的力”);还有一个规律: 对角元恒为正、矩阵对称(kij = kji,功的互等定理的体现)。

节点 1 节点 2 u₁ v₁ θ₁ u₂ v₂ θ₂ L(杆长)
平面梁单元的 6 个自由度:两端各承受 轴力(u)、剪力(v)、弯矩(θ 对应转动)

3.2 桁架杆单元(2 个自由度)

桁架杆只传递轴力,两端铰接、不传递弯矩,局部刚度矩阵只剩轴向部分:

k = EAL · [ 1  −1 ; −1  1 ]   (对应两端轴向位移)

在本求解器里,桁架杆还可以和梁单元混用:刚架加斜撑、排架带支撑都直接支持,程序按单元类型分别组装。

4 坐标变换:从局部到整体

单元刚度矩阵是在“沿杆轴”的局部坐标系里写的,但结构里的杆件方向各不相同,必须统一到整体坐标系(水平 x、竖直 y)。 设杆轴与整体 x 轴的夹角为 α(c = cos α,s = sin α),把整体杆端位移旋转到局部,用的转换矩阵是:

d局部 = T · d整体, T = diag(R, 1, R, 1),R = [ c  s ; −s  c ]

把它代入局部刚度关系 k·d局部 = f局部,两边同乘 Tᵀ 得到整体坐标系下的单元刚度矩阵:

Ke = Tᵀ · k · T

为什么这样做?力与位移都是矢量,旋转坐标系时它们按同一规则旋转;刚度矩阵作相似变换后, 它仍然满足“对称、正定、刚体位移不产生内力”这些物理性质。斜杆、斜柱、斜撑全都靠这一步统一进来。

5 整体组装:K·D = P

给每个节点的自由度编号(第 i 节点对应 3i、3i+1、3i+2 号自由度),然后遍历所有单元,把 Ke 的 6×6 元素“对号入座”累加进整体刚度矩阵 K 的对应位置,同时把每个单元的等效节点荷载累加进 P:

Kab ← Kab + Kepq, Pa ← Pa + fep

共享节点(比如连续梁的中间支座、刚架的梁柱节点)处,相邻单元的刚度与荷载会自动叠加——这就是“节点连接”在矩阵层面的含义, 也是该方法被称为“直接刚度法”的原因:不需要像力法那样选基本体系、列协调方程,直接堆叠即可。

规模感:虽然 K 是 3N × 3N 的方阵,但绝大多数元素为零(一个节点只与相连杆件耦合)。 本求解器按“非零才写”的方式组装,几百个节点的模型也是毫秒级完成。

6 等效节点荷载:把跨内荷载搬到节点

矩阵位移法只认识“节点荷载”。跨内作用的均布荷载(比如梁上的线荷载)必须先转换成等效节点荷载—— 按能量等价(虚功原理):feq = ∫ Nᵀ q ds,N 是形函数。对满跨均布荷载,结果就是教科书上的固端力: 两端各分担 qL/2 的剪力,两端固端弯矩 ±qL²/12(符号随杆端方向约定)。

求解器内部按“一致荷载向量”实现(分布在 6 个自由度上的等价节点力),因此无论杆件斜置、还是按局部轴向加载, 等效都严格成立。求解完成后,这些等效荷载会与杆端力一起“还原”成真实的跨内内力与挠度,不会留在结构里。

易混点:本工具里均布荷载 q 按杆件实际长度取值(总荷载 = q × 杆长)。 斜屋面上的竖向荷载若习惯按水平投影取值,请先换算(q沿杆 = q投影 × cos α),再输入。

7 支座约束与支座沉降

支座在矩阵层面就是“把某些自由度固定为已知值”。本求解器支持四类支座及其组合:

  • 固定端:约束 u、v、θ 全部 3 个自由度,符号为垂直于杆轴的墙 + 斜毛刺;
  • 铰支座:约束 u、v(不约束转动);
  • 辊轴支座:只约束一个平动方向(竖向或水平),符号为三角形 + 滚圆;
  • 链杆支座(竖杆式):同样只约束一个平动方向,画法为教科书常见的「节点—竖杆—下端铰—地面」,与辊轴力学含义相同、只是表达方式不同;
  • 定向支座:约束转动 + 一个平动方向。

处理方式是经典的分块法:把自由度分成“自由”与“约束”两组,方程 K·D = P 分块写成 Kff·Df = Pf − Kfc·Dc, 只对自由自由度求解。右侧的 Kfc·Dc 正是支座沉降的入口:支座位移不为零时,它会像外力一样驱动结构产生内力 (这正是“不均匀沉降引起附加内力”的数学根源)。

还有一个细节:如果某个自由度的刚度全为零(例如两端都是铰的杆件端部转角、或者悬空节点),整体方程会奇异。 求解器会自动识别并约束这类“零刚度自由度”,保证方程可解,同时不改变结构的受力。

8 解方程与支座反力

线性方程组用带主元选取的高斯消元求解(规模:自由度数 = 3×节点数 − 约束数)。得到全部节点位移 D 后,支座反力由整体平衡回代:

R = K·D − P作用于支座自由度

每个支座自由度上的“不平衡力”就是反力——这也是程序自带校核的基础。求解器每次计算都会做整体平衡校核: ΣFx = 0、ΣFy = 0、ΣM = 0(含全部外荷载与支座反力),并在结果面板给出相对残差。 正常情况下残差在 1e-12 量级,说明解是干净的;若模型有机构(约束不足),会直接给出“哪个节点哪个方向无法平衡”的报错,而不是输出可疑结果。

9 杆端力与内力图(N / V / M)

节点位移只是“半成品”。对每根杆件,先由整体位移算出杆端位移,转换到局部坐标系,再用单元刚度矩阵算杆端力, 最后叠加跨内荷载的贡献,沿杆长积分恢复内力:

N(s) = Ni − qx·s  V(s) = Vi − qy·s  M(s) = Mi + Vi·s − ½ qy·s²

也就是说:轴力沿杆按轴向荷载线性变化;剪力是常数(无分布荷载时)或线性(有分布荷载时); 弯矩对 s 积分一次是剪力、两次是弯矩,均布荷载下弯矩图因此是二次抛物线。集中荷载只作用在节点上, 所以每根无跨内集中力的杆件内力图都是精确的(同一直线/抛物线),绘图用 21 个采样点描线,极值点解析求出、不靠肉眼估计。

工具输出的约定(与结构工程制图习惯一致):

  • 弯矩图画在受拉侧,正负号仍按材料力学规则;
  • 剪力图按局部 +y′ 侧绘制,正剪力画在上侧;
  • 轴力图受拉为正;每根杆上直接标注极值及其位置(x = … 或 s = …)。

10 杆端铰的处理:静力凝聚

梁端带铰(不传递弯矩)的杆件,不能简单地把刚度矩阵里转角那行删掉——那会同时丢掉另一端的转动约束。 正确做法是静力凝聚:把自由度分成“要释放的”与“保留的”,消去被释放的自由度:

k* = kaa − kar·krr−1·kra, f* = fa − kar·krr−1·fr

这样该端弯矩自动为零、而另一端刚度完好无损。反过来,求解完成后被释放端的转角再由 krr·dr = fr − kra·da 回代,用于画变形曲线。 本求解器支持两端分别设置铰(单端铰、两端铰、连续梁带铰跨越等情形),三铰刚架、带铰连续梁都能算。

11 变形曲线怎么画

杆件的挠度曲线由两部分叠加:两端节点位移/转角引起的 Hermite 三次插值,加上跨内均布荷载的特解:

v(s) = N₁(s)·vi + N₂(s)·θi + N₃(s)·vj + N₄(s)·θj + qy · s²(L−s)²24 EI

对“节点荷载 + 满跨均布荷载”组合,这个表达式是解析精确的(Euler–Bernoulli 梁在均布荷载下挠度是四次多项式)。 所以简支梁一次跨中挠度可以直接对到闭式解 5qL⁴/384EI,不需要剖分网格。 变形图把最大位移放大成整数倍显示,放大倍率在图上标出;“最大位移”统计的是整个结构所有杆件跨内的最大挠度, 不是只有节点位移。

为什么强调这点?简支梁两端节点都在支座上、节点位移为 0,但跨中挠度不为 0 —— 如果只看节点位移会误判“没有变形”。 内力图与变形图都应当以“跨内”为准。

12 精度、验证与适用范围

直接刚度法对线弹性小变形问题是精确解(误差只来自浮点数运算)。为了证明实现无误,本求解器内核用 Node 脚本对拍了 14 组教科书闭式解,覆盖:

验证项闭式解实测误差
简支梁 · 满跨均布跨中 M = qL²/8,挠度 5qL⁴/384EI< 1e-12
悬臂梁 · 端部集中力M = −PL,挠度 PL³/3EI,转角 PL²/2EI< 1e-12
两端固定梁 · 满跨均布端弯矩 ∓qL²/12,跨中 +qL²/24< 1e-12
一端固定一端铰 · 均布R固 = 5qL/8,R铰 = 3qL/8< 1e-12
两跨连续梁 · 均布中支座 M = −qL²/8,R = 3qL/8 / 10qL/8< 1e-12
三铰刚架 · 顶部竖载水平推力 H = PL/4h< 1e-12
两杆桁架 · 顶点竖载N = −P/(2sinθ)< 1e-12
支座沉降 · 内力校核刚体位移、内力恒为 0< 1e-15

适用:平面杆系(梁、刚架、排架、桁架、混合结构),线弹性静力分析,节点位移/反力/内力/变形。

暂不包含:二阶效应(P-Δ / 压杆稳定)、材料非线性、动力与地震反应、温度作用、支座弹簧、跨内集中力(可将其放在节点上实现)、三维结构。 这些超出“平面线弹性静力分析”的范围,正式设计请按现行规范配合专用程序复核。

13 常见问题(FAQ)

矩阵位移法(直接刚度法)和力法、位移法是什么关系?

位移法以节点位移为基本未知量;矩阵位移法就是位移法的矩阵化、程序化版本。力法则以多余未知力为基本未知量。手算时位移法靠查表写杆端弯矩,矩阵位移法把单元刚度矩阵组装成整体刚度方程 K·D = P 直接求解,因此适合计算机实现,是一切杆系有限元程序的基础。

为什么简支梁两端支座处位移是 0,跨中却有挠度?

因为“节点位移”只描述节点处的位移。简支梁两个节点都落在支座上,节点竖向位移确实是 0;但杆件内部的挠度由两端位移与转角插值(Hermite 三次),再叠加跨内均布荷载的特解得到,跨中挠度 5qL⁴/384EI 正是这么算出来的。所以判断“有没有变形”要看跨内,不能只看节点位移表。

为什么弯矩图画在受拉侧?

这是结构工程的制图习惯:弯矩图纵坐标画在杆件受拉的一侧,可以一眼看出哪里受拉、纵向钢筋该配在哪一侧。本求解器默认按此约定绘制,正负号仍按材料力学规则给出;需要传统画法时可对照横坐标轴判读。

支座反力怎么校核?

用整体平衡:ΣFx = 0、ΣFy = 0、对任一点 ΣM = 0。求解器每次计算都会做整体平衡校核并给出残差,同时把反力箭头直接标在结构图上,可以和手算逐项对照。例如两跨连续梁满跨均布:边支座 3qL/8、中支座 10qL/8,一眼可验。

能算连续梁、门式刚架、桁架、三铰刚架吗?

能。只要是由梁单元和桁架杆单元组成的平面杆系结构都可以:多跨连续梁、门式刚架、排架、桁架、组合结构、带杆端铰的杆件都支持。求解器内置 15 个标准算例,可一键载入对照:基本梁系(简支梁、悬臂梁、固端梁、一端固定一端铰、两跨连续梁)、桁架与刚架(两杆桁架、三铰刚架、门式刚架、双跨刚架带斜撑),以及教材经典算例——三铰拱(带拉杆,拉杆轴力 H=M°c/f)、两跨静定梁(与连续梁对照:30/60/30 vs 18.75/62.5/18.75)、平行弦桁架、两铰刚架(一次超静定)、外伸梁(支座负反力)。

均布荷载按杆长还是水平投影计算?

本工具按杆件实际长度计算:总荷载 = q × 杆长。斜杆上的竖向均布荷载若习惯按水平投影取值(如屋面荷载),请先换算再输入。

计算精度怎么样?和 SAP2000、MIDAS 比有差别吗?

对线弹性、小变形的平面杆系结构,直接刚度法给出的是精确解(数值误差在 1e-12 量级),与主流有限元软件在相同模型下结果一致——内核已用 14 组教科书闭式解逐项对拍。差别主要在功能范围:不含二阶效应、材料非线性、动力与屈曲分析。

模型数据会上传服务器吗?

不会。求解器全部在前端本地计算(纯 JavaScript),模型数据不上传任何服务器,也不需要注册登录;绘图、求解、导出计算书都在你的浏览器里完成,可放心用于工程算例。离线时(页面已加载后)也能继续计算。

开始使用

理解原理之后,回到工具里动手试试:画一根简支梁,加上均布荷载,对照本文第 3、6、9 节看弯矩图与挠度是怎么来的; 再把支座改成固定端,观察 ±qL²/12 的固端弯矩出现在图上。

本文由「行恒简安 · 结构在线计算工具箱」维护;求解器依据《结构力学》教材(位移法 / 矩阵位移法章节)的经典理论实现, 适用于线弹性、小变形、一阶静力分析的平面杆系结构。正式设计成果请按现行规范复核。