Проблема интеграции составных функций с Matlab - PullRequest
0 голосов
/ 06 июля 2019

Я создал итерацию для оценки цены модели Call with Heston, но когда приходит время для интеграции, Matlab показывает мне много ошибок.

Все работает нормально до интеграла, я оценил все, игнорируя интегральную часть, и функции работают нормально.

u=[0.5,-0.5];
a=kappa*theta;
b=[kappa+lambda-rho*sigma,kappa+lambda];
for m=1:2
d{m} = @(x) sqrt((rho*sigma*x*i-b(m))^2-(sigma^2)*(2*u(m)*x*i-x^2)^2);
g{m} = @(x) (b(m)-rho*sigma*x*i+d{m}(x))/(b(m)-rho*sigma*x*i-d{m}(x));
D{m} = @(x) ((b(m)-rho*sigma*x*i+d{m}(x))/sigma^2)*((1-exp(1)^(tau*d{m}(x)))/(1-g{m}(x)*exp(1)^(tau*d{m}(x))));
C{m} = @(x) r*x*i*tau+(a/sigma^2)*((b(m)-rho*sigma*x*i+d{m}(x))*tau-2*log((1-g{m}(x)*exp(1)^(tau*d{m}(x)))/(1-g{m}(x))));
f{m} = @(x) exp(C{m}(x)+D{m}(x)*v0+i*x*log(S0));
F{m} = @(x) real((exp(-i*x*log(K))*f{m}(x))/(i*x));
P(m) = integral(F{m},0,inf);
end

Это ошибки, которые я получаю после оценки интеграла:

Ошибка при использовании ^ Один аргумент должен быть квадратной матрицей, а другой - должен быть скаляр. Используйте POWER (. ^) Для поэлементного питания.

(много ошибок с функциями, но они работали нормально, прежде чем пытаться интегрировать)

Ошибка в integraCalc / iterateScalarValued (строка 314) FX = FUN (т);

Ошибка в integraCalc / vadapt (строка 132) [q, errbnd] = iterateScalarValued (u, tinterval, pathlen);

Ошибка в integraCalc (строка 83) [q, errbnd] = vadapt (@ AToInfInvTransform, интервал);

Ошибка в интеграле (строка 88) Q = integraCalc (fun, a, b, opstruct);

1 Ответ

1 голос
/ 08 июля 2019

Вам необходимо преобразовать каждую операцию умножения, деления и экспоненты в ее скалярную версию:

for m=1:2
d{m} = @(x) sqrt((rho.*sigma.*x.*i-b(m)).^2-(sigma.^2).*(2.*u(m).*x.*i-x.^2).^2);
g{m} = @(x) (b(m)-rho.*sigma.*x.*i+d{m}(x))./(b(m)-rho.*sigma.*x.*i-d{m}(x));
D{m} = @(x) ((b(m)-rho.*sigma.*x.*i+d{m}(x))./sigma.^2).*((1-exp(1).^(tau.*d{m}(x)))./(1-g{m}(x).*exp(1).^(tau.*d{m}(x))));
C{m} = @(x) rho.*x.*i.*tau+(a./sigma.^2).*((b(m)-rho.*sigma.*x.*i+d{m}(x)).*tau-2.*log((1-g{m}(x).*exp(1).^(tau.*d{m}(x)))./(1-g{m}(x))));
f{m} = @(x) exp(C{m}(x)+D{m}(x).*v0+i.*x.*log(S0));
F{m} = @(x) real((exp(-i.*x.*log(K)).*f{m}(x))./(i.*x));
P(m) = integral(F{m},0,inf);
end

Это работает, потому что при интеграции Matlab будет оценивать вашу функцию F{m} по вектору, а не по скалярным значениям. Ошибки, которые вы получаете, в основном говорят вам то же самое.

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