奇怪的Matlab输入参数错误?

时间:2011-05-14 18:39:55

标签: matlab

嘿那里 我有以下Matlab代码。它抱怨:

???输入参数“r”未定义。

==>中的错误BlackScholesPriceTmp at 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参数而不是其他参数。我不明白为什么其他人被抱怨?我在休息时做的是什么,而不是在r?

3 个答案:

答案 0 :(得分:2)

在MATLAB中,您可以调用一个小于声明的输入参数数量的函数。如果被调用函数尝试访问存储在未指定的参数中的值,则只会出错。在这种情况下,错误消息将是您获得的消息,即“输入参数” parameterName “未定义。”。

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 :(得分:1)

我认为除了r

之外还有几个问题

使用包含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

答案 2 :(得分:0)

您很可能正在尝试运行该功能。您必须在命令窗口(控制台)中使用[price,delta,gamma,vega,theta]=BlackScholesPriceTmp(CallPutFlag,S,X,T,r,v,noutparams)在外部调用该函数。但是,请确保使用您想要的值初始化每个输入,否则您将再次收到错误。