(Matlab) Использование нескольких аргументов анонимной функции и метода деления пополам, чтобы найти корни функции
Как указано в заголовке, я использую эти коды для решения вопроса, указанного выше, поэтому в основном есть два массива, mid_call и strike, которые повторяются с использованием i, и для каждого mid_call(i) и k (i) должно быть быть соответствующим корнем, сигма. Однако всякий раз, когда я пытаюсь запустить программу, я всегда получаю эту ошибку:
Ошибка при использовании @(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)) + тау сигма.^2/2)./(sqrt(тау).* сигма))-sqrt(тау).* сигма)- 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
Я знаю, что это довольно длинный вопрос, но любая помощь будет чрезвычайно признательна!
1 ответ
В вашем коде, k
отсутствует в вызовах f
, Измените свои строки с
f_lo = f(sigma_lo);
f_hi = f(sigma_hi);
f_new = f(sigma_new);
в
f_lo = f(sigma_lo,k);
f_hi = f(sigma_hi,k);
f_new = f(sigma_new,k);
и код не выдает никакой ошибки.