目前我正在使用Secant方法执行代码,到目前为止代码运行正常。 但是,我仍然需要通过计算我在“割线”功能中使用的函数调用次数来更新我的“count.funcCount”。我该如何修改我的代码?
这是我到目前为止的代码:
function [ root, fcneval, count ] = secant(f, x0, x1, my_options)
my_options = optimset('MaxIter', 50, 'TolFun', 1.0e-5);
count = struct('iterations',0,'funcCount',0,'message',{'empty'});
xp = x0; %# Initialize xp and xc to match with
xc = x1; %# x0 and x1, respectively
MaxIter = 100;
TolFun = 1.0e-5;
%# Secant Method Loop
for i = 2:MaxIter
fd = f(xc) - f(xp); %# Together, the ratio of d and fd yields
d = xc - xp; %# the slope of the secant line going through xc and xp
xn = ((xc * fd) - (f(xc) * d)) / fd; %# Secant Method step
if (abs(xc - xn) < TolFun) && (abs(f(xn)) < TolFun) %# Stopping condition
break;
elseif i > MaxIter %# If still can't find a root after maximum
%# 100 iterations, consider not converge
count.message = sprintf('Do not converge');
end
xp = xc; % Update variables xc and xp
xc = xn;
end
%# Get outputs:
root = xn;
fcneval = f(root);
count.iterations = i;
end %# end function
---------------------------------------
function [f] = fun(x)
f = cos(x) + x;
end
请帮帮我,谢谢你
答案 0 :(得分:0)
虽然我不理解你的问题,但我认为你可以使用计数器。用零初始化它并在每次调用函数时递增它。您正在使用内置函数,只需对其源代码进行必要的更改(仅供参考:您可以在matlab中执行此操作)然后使用新名称保存它,然后在主代码中使用它。
答案 1 :(得分:0)
您可以创建一个嵌套函数,该函数可以访问其父函数的变量(包括函数f
和计数器count.funcCount
)。该函数将调用执行计算的实际方法,然后递增计数器。
这是一个相当愚蠢的例子来说明这个概念:
function [output,count] = myAlgorithm(f, x0)
count = 0;
output = x0;
while rand()<0.99 %# simulate a long loop
output = output + fcn(x0);
end
%# nested function with closure
function y = fcn(x)
%# access `f` and `count` inside the parent function
y = f(x); %# call the function
count = count + 1; %# increment counter
end
end
现在你把它称为:
[output,count] = myAlgorithm(@(x)cos(x)+x, 1)