Matlab有限差分法求解梁挠度RHS赋值维度不匹配报错解决
报错核心成因
该赋值维度不匹配错误的直接触发原因:你在循环中给RHS(i)这个单个标量位置赋值时,传入的右侧变量p是长度为N=6的全行向量,单元素位置无法存储长度为6的向量,直接触发报错。
除了显性的维度问题,你的代码还存在3个会导致结果完全错误的隐性逻辑问题:
- 右端项物理公式写错:欧拉梁简支均布载荷的差分控制方程为
EI*(u(i+1)-2u(i)+u(i-1))/dx² = w*x(i)*(L-x(i))/2,整理后右端项应为M(i)*dx²/EI,你误将EI写到了分子位置,计算出的挠度量级会完全偏离真实值。 - 载荷项维度不匹配:你计算的
p是包含首尾两个边界节点的全节点向量,但RHS只对应N-2个内部未知节点,不需要边界点的载荷值。 - 刚度矩阵构造缺项:原循环逻辑漏了刚度矩阵最后一行的次对角元素,就算RHS维度修正完成,求解出的挠度也是错误的。
修正后可直接运行的代码
clear; clc; close all; %%% 基础参数输入 L = 2; I = 200000; E = 2000000000; EI = E * I; w = 20000; N = 6; dx = L/(N-1); x = linspace(0,L,N); u = zeros(1,N); %%% 简支梁边界条件:首尾挠度为0 u(1) = 0; u(end) = 0; %%% 计算各节点截面弯矩 M = w.*x.*(L-x)/2; %%% 构建右端项:仅截取内部节点对应载荷,无需循环赋值,转置为列向量匹配矩阵求解维度 RHS = M(2:end-1)' * dx^2 / EI; %%% 构造三对角刚度矩阵,补全原代码缺失的对角元素 stiffness = -2*eye(N-2,N-2); for i = 1:N-3 stiffness(i,i+1) = 1; stiffness(i+1,i) = 1; end %%% 求解未知节点挠度 u_unknowns = stiffness\RHS; u(2:end-1) = u_unknowns; %%% 结果绘制 plot(x,u,'-o','LineWidth',1.5) xlabel('梁轴向位置 x') ylabel('挠度 u') grid on
排查这类报错的通用方法
后续再碰到「左右两侧元素数量不一致」的报错,直接在报错行加断点,分别查看左侧被赋值位置的维度、右侧待赋值内容的维度,90%以上的场景都是索引截取错误、向量行列方向不匹配、循环赋值时误传入全量数组导致的,不需要逐行通读代码就能快速定位问题。
注:如果运行后发现挠度数值不符合物理常识,优先检查弹性模量、截面惯性矩、梁长、载荷的单位是否统一,原代码未做单位匹配,可根据你实际使用的单位体系调整参数。
内容的提问来源于stack exchange,提问作者Cheng Kai Chew
相关产品推荐
相关产品推荐

