Странный Matlab Ошибка ввода аргумента? - PullRequest
0 голосов
/ 14 мая 2011

Привет, у меня есть следующий код Matlab.Жалуется на:

???Входной аргумент "r" не определен.

Ошибка в ==> BlackScholesPriceTmp при 8 b = r;

Код:

%function [price,delta,gamma,vega,theta]=BlackScholesPriceTmp(CallPutFlag,S,X,T,r,v,noutparams)
function [price,delta,gamma,vega,theta]=BlackScholesPriceTmp(CallPutFlag,S,X,T,r,v,noutparams)
delta=0;
gamma=0;
vega=0;
theta=0;

    b=r;
    d1 = (log(S / X) + (b + v ^ 2 / 2) * T) / (v * T^0.5);
    d2 = d1 - v * T^0.5;

        price=0;
    if CallPutFlag == 'c' ,
        price = S * normal_cdf(d1) - X * exp(-r * T) * normal_cdf(d2);
        %endif
    end
    if noutparams>1,
        delta=exp((b-r)*T)*normal_cdf(d1);
        theta_tmp1= -( S*exp((b-r)*T)*normal_pdf(d1)*v )/(2*T^0.5);
        theta_tmp2= -(b-r)*S*exp((b-r)*T)*normal_cdf(d1);
        theta_tmp3= -r*X*exp(-r*T)*normal_cdf(d2);
        theta=theta_tmp1+theta_tmp2+theta_tmp3;
    %end
    %endif
    else
        %price = X * exp(-r * T) * normal_cdf(-d2) - S * normal_cdf(-d1);
        price = X * exp(-r * T) * normalcdf(-d2) - S * normcdf(-d1);
    end
    if noutparams>1,
        delta=exp((b-r)*T)*(normal_cdf(d1)-1);
        theta_tmp1= -( S*exp((b-r)*T)*normal_pdf(d1)*v )/(2*T^0.5);
        theta_tmp2= (b-r)*S*exp((b-r)*T)*normal_cdf(-d1);
        theta_tmp3= r*X*exp(-r*T)*normal_cdf(-d2);
        theta=theta_tmp1+theta_tmp2+theta_tmp3;
    endif
    end
    if noutparams>1,
    gamma=(normal_pdf(d1)*exp((b-r)*T)) / (S*v*T^0.5);
    vega=S * exp((b-r)*T)*normal_pdf(d1)*T^0.5;
    endif
end

Как новичок в Matlab,почему он жалуется на параметр r, а не на остальные.Я не понимаю, почему другие жалуются?Что я делаю правильно в остальном, но не в г?

Ответы [ 3 ]

2 голосов
/ 15 мая 2011

В MATLAB вам разрешено вызывать функцию с количеством объявленных входных аргументов меньше, чем количество. Ошибка становится только в том случае, если вызываемая функция пытается получить доступ к значению, сохраненному в параметре, который не был указан. В этом случае вы получите сообщение об ошибке, а именно: «Входной аргумент« имя_параметра »не определен.».

Функции MATLAB могут использовать функцию nargin для определения во время выполнения количества фактических переданных аргументов. Часто следующая идиома используется для предоставления значений по умолчанию для тех параметров, которые не указаны:

function foo(a, b)
if nargin < 1
    a = 0; % default for a is 0
end
if nargin < 2
    b = 1; % default for b is 1
end
... code that uses a and/or b ...

Функция foo может быть вызвана любым из следующих способов:

foo(); % equivalent to foo(0, 1);
foo(5); % equivalent to foo(5, 1);
foo(5, 6);
1 голос
/ 14 мая 2011

Я думаю, что есть несколько проблем, кроме г

с использованием строк, содержащих normal_pdf (), normal_cdf (), mormalcdf (), правильная форма: normpdf (), normcdf ()

также у вас есть несколько операторов endif, вместо этого matlab использует операторы end.

Я могу вызвать следующее как функцию, успешно используя Matlab 7.9 или GNU Octave 3.2.3.

    function [price,delta,gamma,vega,theta]=BlackScholesPriceTmp(CallPutFlag,S,X,T,r,v,noutparams)

delta=0; gamma=0; vega=0; theta=0;

b=r;
d1 = (log(S / X) + (b + v ^ 2 / 2) * T) / (v * T^0.5);
d2 = d1 - v * T^0.5;

price=0;

if CallPutFlag == 'c' ,
    price = S * normcdf(d1) - X * exp(-r * T) * normcdf(d2);
end

if noutparams>1,
    delta=exp((b-r)*T)*normcdf(d1);
    theta_tmp1= -( S*exp((b-r)*T)*normpdf(d1)*v )/(2*T^0.5);
    theta_tmp2= -(b-r)*S*exp((b-r)*T)*normcdf(d1);
    theta_tmp3= -r*X*exp(-r*T)*normcdf(d2);
    theta=theta_tmp1+theta_tmp2+theta_tmp3;
else
    price = X * exp(-r * T) * normcdf(-d2) - S * normcdf(-d1);
end

if noutparams>1,
    delta=exp((b-r)*T)*(normcdf(d1)-1);
    theta_tmp1= -( S*exp((b-r)*T)*normpdf(d1)*v )/(2*T^0.5);
    theta_tmp2= (b-r)*S*exp((b-r)*T)*normcdf(-d1);
    theta_tmp3= r*X*exp(-r*T)*normcdf(-d2);
    theta=theta_tmp1+theta_tmp2+theta_tmp3;
end

if noutparams>1,
    gamma=(normpdf(d1)*exp((b-r)*T)) / (S*v*T^0.5);


    vega=S * exp((b-r)*T)*normpdf(d1)*T^0.5;

end
0 голосов
/ 24 июня 2012

Скорее всего, вы пытаетесь запустить саму функцию.Вы должны вызвать функцию извне, используя [price,delta,gamma,vega,theta]=BlackScholesPriceTmp(CallPutFlag,S,X,T,r,v,noutparams) в командном окне (консоли).Однако не забудьте инициализировать каждый из входов требуемыми значениями, иначе вы снова получите ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...