0

現在、Secant Method でコードを実行していますが、これまでのところ、コードは正常に実行されます。ただし、「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

助けてください、よろしくお願いします

4

2 に答える 2

0

私はあなたの質問を理解していませんでしたが、それでもカウンターを使用できると思います. ゼロで初期化し、関数が呼び出されるたびにインクリメントします。組み込み関数を使用しています。そのソース コードに必要な変更を加えてください (FYI : matlab でこれを行うことができます)。新しい名前で保存してから、メイン コードで使用します。

于 2012-07-11T07:44:32.927 に答える
0

f親関数の変数 (関数と counterを含む) にアクセスできるネストされた関数を作成できます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)
于 2012-07-11T15:34:34.980 に答える