필터 지우기
필터 지우기

Understanding the output returned by anonymous function

조회 수: 1 (최근 30일)
Purnjay Peshawaria
Purnjay Peshawaria 2020년 7월 18일
답변: Abhishek Gangwar 2020년 7월 18일
I have a function blackscholes.m that returns 2 outputs: c and dcds. Here is the code:
function [c, dcds] = blackscholes(S, K, r, sigma, Tmt)
s = sigma * sqrt(Tmt);
d1 = ( log(S/K) + ( r + sigma.^2/2)*(Tmt) ) ./ s;
d2 = d1 - s;
% Use normpdf and normcdf from Statistics toolbox
c = S .* normcdf(d1) - K * exp(-r*Tmt) * normcdf(d2);
% Derivative of call vlaue w.r.t. volatility sigma
dcds = S .* normpdf(d1) * sqrt(Tmt);
sigma is a vector defined in the code below. I have created an anonymous function f. My problem is when I calculate f(sigma) , I'm getting the first ouput of blackscholes function - cmkt. Is there a way for the anonymous function to return multiple outputs. I have read the documentation and it says you can invoke anonymous function to access the outputs returned by your function (blackscholes in this case) . But I get error when I try the last line of the following code:
format compact
Tmt = 0.5; % time to maturity in years
r = 0.053; % risk-free interest rate per year
S = 32.75; % current stock price
K = 32.00; % strike price 1
cmkt = 2.74; % current market price of call option
pmkt = 1.16; % current market price of put option
% Anonymous function for difference between Black-Scholes price and market price
f = @(sigma) blackscholes(S, K, r, sigma, Tmt) - cmkt;
sigma = linspace(0,0.8);
result = f(sigma); % this works fine
[result1, result2] = f(sigma); % this is giving error

채택된 답변

Abhishek Gangwar
Abhishek Gangwar 2020년 7월 18일
Yes, you are right, you are invoking the function 'f' correctly but the problem is function 'f' is returning only one output which is a row vector of dimension 1x100, lets consider the statement where you are defining anonymous function.
You are calling blackscholes() function with appropriate inputs but because of you are not storing its output anywhere, this output is being stored in matlab's default variable 'ans' and eventually this variable is storing first output row vector of blackscholes() function which is 'c' and then subtracting 'cmkt' from every element of that row vector and final resulting row vector is being returned from 'f' function.
You can also check this by modifying this line "f = @(sigma) blackscholes(S, K, r, sigma, Tmt) - cmkt;" as
"f = @(sigma) blackscholes(S, K, r, sigma, Tmt);" and then try to invoke this modified anonymous function, you will get both the output vectors of blackscholes() function.
You need to modify your code, you can subtract 'cmkt' within the blackscholes() function or just capture both the row vectors returned from blackscholes() function and then subtract 'cmkt' from them.

추가 답변 (1개)

madhan ravi
madhan ravi 2020년 7월 18일
f = @(S, K, r, sigma, Tmt,cmkt)deal(blackscholes (S, K, r, sigma, Tmt) - cmkt);
[o1, o2] = f(S, K, r, sigma, Tmt, cmkt);

카테고리

Help CenterFile Exchange에서 Curve Fitting Toolbox에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by