如何在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
相关产品推荐
相关产品推荐

