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

求助:基于有限差分的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 09:15:33