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

如何在Matlab割线法实现中最小化函数g(x)的调用次数?

问题解决:Matlab割线法代码优化与报错修复

一、报错修复

你遇到的报错是因为调用mySecant时未传入函数句柄,Matlab无法识别g为函数。正确调用方式需在函数名前加@,将其转为函数句柄:

% 示例:假设目标函数是f(x) = x^2 - 2
[x, tolFunc, ere, n] = mySecant(@(x)x^2-2, 1, 2, 100, 1e-6);
% 或自定义函数文件myFunc.m后,传入@myFunc

二、函数调用次数优化(每次迭代仅调用1次g(x))

原代码每次迭代重复调用g(x),通过临时变量存储函数值,可将每次迭代的函数调用次数降至1次。修改后的代码如下:

function [x, tolFunc, ere, n] = mySecant(g, x00, x0, N, epsok)
    % 初始化变量:存储当前与前一次的函数值,避免重复调用
    x_prev = x00;
    f_prev = g(x_prev); % 仅调用1次g(x00)
    x = x0;
    f_curr = g(x);      % 仅调用1次g(x0)
    tolFunc = abs(f_curr);
    n = 0;

    % 主循环
    while tolFunc > epsok && n < N
        % 割线法计算下一个近似值,直接用已存储的函数值
        x_next = x - f_curr * (x - x_prev) / (f_curr - f_prev);
        
        % 更新前一次的x和函数值
        x_prev = x;
        f_prev = f_curr;
        
        % 更新当前x,仅调用1次g(x_next)——这是本次迭代唯一的函数调用
        x = x_next;
        f_curr = g(x);
        
        % 计算容差与相对误差
        tolFunc = abs(f_curr);
        ere = abs((x - x_prev) / x);
        
        % 迭代计数+1
        n = n + 1;
    end

    % 检查是否达到容差要求
    if tolFunc > epsok
        error("Requested tolerance in function could not be reached within maximum number of iterations.");
    end
end

优化说明:

  • 初始化时提前存储x00和x0对应的函数值f_prev、f_curr,避免后续重复调用
  • 每次循环仅在计算新的x后调用1次g(x),其余计算均使用已存储的函数值
  • 彻底消除了原代码中g(x)重复调用的问题,提升效率

内容的提问来源于stack exchange,提问作者Eric

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 23:28:20