(Matlab) Използване на анонимна функция с множество аргументи и метод на разполовяване за намиране на корените на функция

Както е посочено от заглавието, използвам тези кодове, за да разреша въпроса, посочен по-горе, така че основно има два масива, mid_call и strike, които се повтарят с помощта на i, и за всеки mid_call(i) и k(i) трябва да има е съответен корен, сигма. Въпреки това, когато се опитам да стартирам програмата, винаги получавам тази грешка:

Грешка при използване на @(sigma, k) s.*normcdf((log(s./(q_tau.k))+tausigma.^2/2)./(sqrt(tau).* сигма)) - q_tau.*k.*normcdf(((log(s./(q_tau.k))+tauсигма.^2/2)./(sqrt(tau).* sigma))-sqrt(tau).*sigma)- mid_call(i) Няма достатъчно входни аргументи

Ще бъда вечно благодарен за вашата помощ!

Начало на кода:

mid_call = 47.4350,37.7800,28.4400,19.6800,11.8800,5.6150,1.7250,0.3150,0.0600

iv_list = []; 
tol = 1.e-8;
maxit = 50;

for i = 1:1:9
    tau = 5/12;
    q_tau = 1.0000;
    s = 197.07; 
    strike = 150:10:230;
    k = strike(i);
    syms sigma;
    d = @(sigma, k) (log(s./(q_tau.*k))+tau*sigma.^2/2)./(sqrt(tau).*sigma);
    f = @(sigma, k) s.*normcdf((log(s./(q_tau.*k))+tau*sigma.^2/2)./(sqrt(tau).*sigma)) -    q_tau.*k.*normcdf(((log(s./(q_tau.*k))+tau*sigma.^2/2)./(sqrt(tau).*sigma))-sqrt(tau).*sigma)- mid_call(i);

    %starting value
    sigma_lo = zeros(size(mid_call(i)));
    sigma_hi = 10*ones(size(mid_call(i)));
    f_lo = f(sigma_lo);
    f_hi = f(sigma_hi);

    % can we vectorize this?
    if sign(f_lo)==sign(f_hi), disp('*** Error: solution not bracketed'), end 

    %let's rollllll
    for it = 1:maxit      
        sigma_new = (sigma_lo + sigma_hi)/2;      % cut interval in half 
        f_new = f(sigma_new);
        diff_x = max(abs(sigma_lo - sigma_hi));
        diff_f = max(abs(f_new));
        [it sigma_new];

        if max(diff_x,diff_f) < tol, break, end

        if sign(f_new)==sign(f_lo)
            sigma_lo = sigma_new; 
            f_lo = f_new;
        else 
            sigma_hi = sigma_new;
            f_hi = f_new;
        end 
    end 
    iv_list(end+1) = sigma_new ;
end

Знам, че това е доста дълъг въпрос, но всяка помощ ще бъде изключително благодарна!


person Donnie    schedule 06.11.2014    source източник
comment
Къде е обаждането за d? Не го намерих във вашия код. Освен това f трябва да се извика с два аргумента, f = @(sigma, k). Вие обаче го извиквате само с едно: f_lo = f(sigma_lo);, ' f_hi = f(sigma_hi);', f_new = f(sigma_new);. И в трите случая k липсва.   -  person Nemesis    schedule 06.11.2014


Отговори (1)


във вашия код k липсва в извикванията на f. Променете вашите линии от

f_lo = f(sigma_lo);
f_hi = f(sigma_hi);

f_new = f(sigma_new);

to

f_lo = f(sigma_lo,k);
f_hi = f(sigma_hi,k);

f_new = f(sigma_new,k);

и кодът не извежда никаква грешка.

person Nemesis    schedule 06.11.2014