Matlab中用二阶Adams-Bashforth法求解洛伦兹方程报错排查
问题根源
报错来自自定义Adams函数的硬编码bug,和调用方式无关。
你在函数中写死了状态存储矩阵的维度为2:x = zeros(2,N+1);,这行代码默认要求解的是2个状态变量的微分方程,但洛伦兹系统是包含x/y/z三个变量的3维系统,传入的初值[1 1 1]是长度为3的向量,给2行的矩阵列赋值3个元素自然会触发维度不匹配错误。
除此之外原函数还有一个潜在隐患:没有统一初值和导数返回值的行/列维度,传入行向量初值时,后续欧拉步计算也可能出现维度广播异常。
修复方案
修改Adams函数,移除硬编码的维度值,根据传入初值自动适配状态维度,同时统一向量为列格式避免维度冲突,修复后的完整函数如下:
function [t,x] = Adams(f,t_max,x0,N) h = t_max/N; t = linspace(0,t_max,N+1); % 自动识别系统状态维度,不再硬编码 state_dim = length(x0); x = zeros(state_dim, N+1); % 强制初值转为列向量,统一维度格式 x0 = x0(:); x(:,1) = x0; % 欧拉法计算第一步初始值 x(:,2) = x0 + h.*f(t(1),x(:,1)); % 二阶Adams-Bashforth迭代 for i=2:N x(:,i+1) = x(:,i) + h.*(3/2.*f(t(i),x(:,i)) - 1/2.*f(t(i-1),x(:,i-1))); end end
使用说明
修复后不需要修改原来的调用代码,直接运行即可正常生成洛伦兹吸引子的3D轨迹图。修复后的函数不再限制求解系统的维度,传入任意维度的初值都可以正常计算对应维度的微分方程数值解。
内容的提问来源于stack exchange,提问作者lilfarmerofa
相关产品推荐
相关产品推荐

