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

如何在MATLAB中对meshgrid使用while循环求解洛伦兹方程牛顿分形

洛伦兹方程牛顿法分形实现问题修复方案

核心错误原因

  • 变量名冲突:模板中预先定义了x1=0作为第一个不动点的x坐标,你在循环内部重写了x1 = X1(j)覆盖了该值,导致后续判断收敛到第一个不动点的逻辑abs(X-x1) < eps完全失效,自然不会出现红色像素。
  • 网格定义混乱:题目要求初始值取自x-z平面网格,模板中给出的[X,Y]=meshgrid实际是x和z的初始网格,你错误引入了未定义的Z、nz变量,网格索引逻辑也存在偏移。
  • 收敛判断不严谨:仅判断x方向迭代步长的误差,可能出现x看似收敛但y、z未收敛到不动点的情况,同时没有设置最大迭代次数上限,存在死循环风险。

修复后代码

直接替换模板中注释要求写牛顿法的部分即可:

% 初始化参数:所有点y初始值固定为3*sqrt(2),X为初始x网格,重命名Y为初始z网格避免和y变量冲突
y0 = 3*sqrt(2);
Z0 = Y; 
clear Y; 
max_iter = 33; % 题目给出的最大迭代次数,不会触发超时
tol = 1e-4; % 收敛阈值

% 遍历每个网格点执行牛顿迭代
for i = 1:nx
    for j = 1:ny
        % 初始值赋值
        x = X(i,j);
        y = y0;
        z = Z0(i,j);
        iter = 0;
        err = inf;
        
        % while循环:未收敛且未到最大迭代次数时继续执行
        while err > tol && iter < max_iter
            % 计算雅可比矩阵和右端项
            J = [-sigma, sigma, 0;
                r-z, -1, -x;
                y, x, -beta];
            rhs = -[sigma*(y-x); x*(r-z)-y; x*y - beta*z];
            delta = J\rhs;
            
            % 更新变量
            x = x + delta(1);
            y = y + delta(2);
            z = z + delta(3);
            
            % 计算当前步长的模长作为误差
            err = norm(delta);
            iter = iter + 1;
        end
        
        % 保存收敛后的x值到X矩阵
        X(i,j) = x;
    end
end

补充注意事项

  • 不要修改模板后续的着色逻辑,模板中x1、x2、x3已经预先定义为三个不动点的x坐标,只要你的X矩阵保存的是收敛后的x值,着色会自动完成:红色对应收敛到x=0的不动点,绿色对应x为正的不动点,蓝色对应x为负的不动点,黑色对应迭代33次未收敛的点。
  • 该实现每个网格点收敛后就会退出while循环,不会执行多余的迭代,完全满足Matlab Grader的超时限制要求。

内容的提问来源于stack exchange,提问作者M.K. Saunders

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 07:36:03