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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 10:54:47