求助:基于有限差分的Matlab牛顿法程序报错排查
牛顿法程序错误排查求助
程序代码
主程序
function x = NewtonM(funcF,JacF) x= zeros(2,1); x(1) = 1; x(2) = 5; k = 1; kmax = 100; TOL = 10^(-7); while k < kmax s = J(x)\(-F(x)); x= x + s; if (norm(s,2)< TOL) break; endif k = k + 1; % 新增迭代计数 end end
子函数F
function y = F(x) x1 = x(1); x2 = x(2); y = zeros(2,1); y(1) = x1+x2-3; y(2) = x1^2 + x2^2 -9; end
子函数Z
function z = Z(x) x1 = x(1); x2 = x(2); h = 10^(-7); z = zeros(3,1); z(1) = x1+x2-3 + h; z(2) = (x1+h)^2 + x2^2 -9; z(3) = x1^2 + (x2+h)^2 -9; end
子函数J
function J = J(x) x1 = x(1); x2 = x(2); h = 10^(-7); J = zeros(2,2); % 修正函数调用与偏导计算逻辑 f_val = F(x); z_val = Z(x); J(1,1) = (z_val(2) - f_val(1))/h; J(1,2) = (z_val(3) - f_val(1))/h; J(2,1) = (z_val(2) - f_val(2))/h; J(2,2) = (z_val(3) - f_val(2))/h; end
错误信息
- 错误1:
error: 'F' undefined near line 7 column 13 - 错误2:
error: called from NewtonM at line 7 column 5
问题定位与解决
1. 主函数参数未使用且调用未定义函数
主函数NewtonM定义了funcF和JacF参数,但代码中直接调用了F和J,若这两个函数不在同一作用域或搜索路径内,会触发“未定义”错误。解决方式二选一:
- 将
F和J作为参数传入,把代码中的F(x)替换为funcF(x),J(x)替换为JacF(x); - 确保
F、J、Z和NewtonM在同一脚本文件中,或添加到Matlab/Octave的搜索路径。
2. 子函数J的调用逻辑错误
原代码中Z(1)、F(1)是错误调用,Z和F是需要输入参数x的函数,必须传入x后再提取对应元素,比如先执行f_val = F(x),再取f_val(1)。
3. 数值微分计算逻辑错误
原J中偏导计算完全错误:
- 第一行第一列是∂F₁/∂x₁,应使用
(F([x1+h, x2]) - F(x))(1)/h,对应Z函数的第二个元素; - 第一行第二列是∂F₁/∂x₂,对应
Z函数的第三个元素; - 修正后的代码已调整这部分逻辑。
4. 循环缺少迭代计数
主函数while循环未添加k = k+1,会导致k始终为1,陷入死循环,必须补充该行代码。
5. 语句末尾缺少分号
原代码中x(1) = 1、x(2) = 5、x= x + s末尾无分号,会导致每次迭代都输出变量值,建议添加分号控制输出。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

