实现步骤
-
定义方程组与雅可比矩阵
使用符号变量定义非线性方程组及其雅可比矩阵(各方程对变量的偏导数矩阵)。
matlabsyms x1 x2 x3 % 定义符号变量 F = [3*x1 - cos(x2*x3) - 1/2; % 方程组定义 x1^2 - 81*(x2+0.1)^2 + sin(x3) + 1.06; exp(-x1*x2) + 20*x3 + (10*pi-3)/3]; dF = jacobian(F, [x1, x2, x3]); % 计算雅可比矩阵 -
初始化参数
设置初始猜测值、精度阈值和最大迭代次数。
matlabx0 = [0.1; 0.1; -0.1]; % 初始值 eps = 1e-5; % 精度要求 maxIter = 100; % 最大迭代次数 -
迭代求解
通过牛顿迭代公式更新解,直到满足收敛条件或达到最大迭代次数。
matlabx = x0; for iter = 1:maxIter F_val = subs(F, {x1, x2, x3}, {x(1), x(2), x(3)}); % 计算函数值 dF_val = subs(dF, {x1, x2, x3}, {x(1), x(2), x(3)}); % 计算雅可比矩阵 delta_x = -dF_val \ F_val; % 更新量:x_{n+1} = x_n - J^{-1}F(x_n) x = x + delta_x; if norm(delta_x) < eps % 收敛判断 break; end end -
输出结果
显示最终解及迭代次数。
matlabfprintf('解: x = [%g, %g, %g], 迭代次数: %d\n', x(1), x(2), x(3), iter);
关键注意事项
- 雅可比矩阵计算
- 需确保雅可比矩阵在解附近非奇异,否则迭代可能失败。
- 对于复杂方程组,可使用符号计算(
jacobian函数)或数值差分近似导数。
- 初始值选择
- 初始值需足够接近真实解,否则可能不收敛。
- 可尝试多组初始值验证解的稳定性。
- 收敛性控制
- 设置最大迭代次数避免死循环。
- 可结合二分法等全局方法提高鲁棒性。
参考代码 牛顿迭代接非线性方程组 www.youwenfan.com/contentcsq/97704.html
扩展优化
- 自动微分工具:使用符号计算工具箱或自动微分库提高导数计算精度。
- 并行计算:对大规模方程组可加速雅可比矩阵计算。
- 可视化:绘制迭代过程曲线以分析收敛性。