Matlab ode15i维度不匹配报错原因及代码修正咨询
问题分析与解决方法
核心问题:初始条件维度不匹配
你遇到的维度错误根源在于**y0和yp0被定义为行向量**,而Matlab的ode15i求解器(以及所有ODE/DAE求解器)默认期望状态变量初始值为列向量。
当ode15i执行到内部代码meshsol(:,2) = y0 - h*yp0时:
meshsol(:,2)是一个2×1的列向量(对应求解器内部的网格解列)- 你传入的
y0和yp0是1×2的行向量,计算y0 - h*yp0后得到的仍然是1×2行向量 - Matlab尝试将行向量赋值给列向量时,会错误地触发广播机制,把行向量重复成2×2矩阵,最终导致"2×1左侧无法匹配2×2右侧"的报错
解决步骤
只需要把y0和yp0从行向量改为列向量即可,具体修改如下:
% 原代码(行向量) y0 = [-0.5972 6.2068]; yp0 = 10000*[0.0006 1.0178]; % 修改为列向量(用分号分隔元素) y0 = [-0.5972; 6.2068]; yp0 = 10000*[0.0006; 1.0178];
额外说明
你的StateII函数是显式ODE形式(yp = f(y)),而ode15i原本是用于求解隐式微分代数方程(DAE)的,但它完全兼容这种ODE场景——只要残差函数正确写成res = yp - f(y)的形式(你已经做到了),修改初始条件维度后就能正常运行。
事件函数myEventsFcnII的逻辑没有问题,修改初始条件后,y和yp会以列向量形式传入,y(1)、y(2)、yp(2)的索引访问依然有效。
内容的提问来源于stack exchange,提问作者SimpleProgrammer
相关产品推荐
相关产品推荐

