将复合函数与 Matlab 集成的问题
Issue integrating composite functions with Matlab
我创建了一个迭代来评估 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
这是我计算积分后得到的错误:
Error using ^ One argument must be a square matrix and the other
must be a scalar. Use POWER (.^) for elementwise power.
(函数有很多错误,但在尝试积分之前它们运行良好)
Error in integralCalc/iterateScalarValued (line 314)
fx = FUN(t);
Error in integralCalc/vadapt (line 132)
[q,errbnd] = iterateScalarValued(u,tinterval,pathlen);
Error in integralCalc (line 83)
[q,errbnd] = vadapt(@AToInfInvTransform,interval);
Error in integral (line 88) Q = integralCalc(fun,a,b,opstruct);
您需要将每个乘法、除法和指数运算转换为其标量版本:
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}
。你得到的错误基本上告诉你相同的。
我创建了一个迭代来评估 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
这是我计算积分后得到的错误:
Error using ^ One argument must be a square matrix and the other must be a scalar. Use POWER (.^) for elementwise power.
(函数有很多错误,但在尝试积分之前它们运行良好)
Error in integralCalc/iterateScalarValued (line 314) fx = FUN(t);
Error in integralCalc/vadapt (line 132) [q,errbnd] = iterateScalarValued(u,tinterval,pathlen);
Error in integralCalc (line 83) [q,errbnd] = vadapt(@AToInfInvTransform,interval);
Error in integral (line 88) Q = integralCalc(fun,a,b,opstruct);
您需要将每个乘法、除法和指数运算转换为其标量版本:
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}
。你得到的错误基本上告诉你相同的。