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

