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

Matlab中矩阵与行向量相减操作问题及动量守恒修正需求

航空航天项目动量修正问题

我正在开展一项航空航天领域的大学项目,假设飞机爆炸产生碎片,根据动量守恒定律,爆炸后总动量应保持不变。我随机生成碎片及其速度增量后,出现了动量误差,需要将其修正为零,但当前结果仅趋近于零,推测是矩阵与向量的操作步骤存在错误。现需在Matlab中正确实现矩阵与行向量的相减操作,我的现有代码如下:

Mv=10000; 
V_0 = 200*.3048; 

N=1000;
D=rand(N,1); 
somma=sum(D); 
m_i=(D/somma)*Mv; % 碎片质量
ver=sum(m_i); 

vx_i = randn(N,1);
vy_i = randn(N,1); 
vz_i= randn(N,1);

DeltaV_iStar= [vx_i,vy_i,vz_i]; % 速度增量矩阵


DeltaQ_err=zeros(1,3);
DeltaQ=zeros(N,3); % 初始化矩阵
for k=1:N
  DeltaQ(k,:)=(m_i(k)*DeltaV_iStar(k,:));  
  DeltaQ_err=DeltaQ_err+DeltaQ(k,:);
end
DeltaQ_err % 总动量误差


DeltaV_err = DeltaQ_err/Mv ; % 需要从初始速度增量中减去的误差值

% 错误修正步骤:仅修改了z方向,且误用了x方向的误差分量
DeltaV_c(:,3) = DeltaV_iStar(:,3) - DeltaV_err(1); % 尝试修正后的速度矩阵

%% 用修正后的速度验证动量是否为零
DeltaQ_err2=zeros(1,3);
DeltaQ=zeros(N,3); % 初始化矩阵
for k=1:N
  DeltaQ(k,:)=(m_i(k)*DeltaV_c(k,:));  
  DeltaQ_err2=DeltaQ_err2+DeltaQ(k,:);
end
DeltaQ_err2 % 期望为零的总动量

问题分析与修正

核心错误出在速度修正的代码行:

  • 原代码只对速度增量的z方向(第三列)做了修正,而且错误地使用了x方向的误差分量DeltaV_err(1),导致修正不彻底,动量无法归零。
  • Matlab支持广播机制,可以直接让N×3的矩阵和1×3的行向量逐元素相减,无需循环或单独修改某一列。

修正后的关键代码:

% 正确的速度修正:所有碎片的三个速度分量分别减去对应的误差分量
DeltaV_c = DeltaV_iStar - DeltaV_err;

验证效果

替换修正代码后重新运行,DeltaQ_err2的结果会精确趋近于零(浮点精度范围内可视为严格零),符合动量守恒的要求。

内容的提问来源于stack exchange,提问作者Giovanni Curiazio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 13:25:16