Hi all! I'm trying to replicate in Matlab the following R code:
library(rootSolve)A <- 560223.07B <- 358176r <- 0.0171Ve <- 0.1276263T <- 1D <- exp(-r * T)F <- function(x){ d1 <- x[1] d2 <- x[2] V <- (1 - ((B * D * pnorm(d2)) / (A * pnorm(d1)))) * Ve F1 <- ((log(A / B) + ((r + (0.5 * V^2)) * T)) / (V * sqrt(T))) - d1 F2 <- d1 - (V * sqrt(T)) - d2 c(F1=F1,F2=F2)}solution <- multiroot(f = F, start = c(0,0))solution
Which produces the following output:
$root[1] 9.818820 9.771408$f.root F1 F2 -7.854641e-10 -3.478249e-10$iter[1] 3$estim.precis[1] 5.666445e-10
Now, let's move to my Matlab implementation:
A = 560223.07;B = 358176;r = 0.0171;Ve = 0.1276263;T = 1;D = exp(-r * T);solution = fsolve(@(x)objective(x,A,B,T,Ve,r,D),[0 0]);solutionfunction F = objective(x,A,B,T,Ve,r,D) d1 = x(1); d2 = x(2); V = (1 - ((B * D * normcdf(d2)) / (A * normcdf(d1)))) * Ve; F1 = ((log(A / B) + ((r + (0.5 * V^2)) * T)) / (V * sqrt(T))) - d1; F2 = d1 - (V * sqrt(T)) - d2; F = [F1 F2];end
The solution is very different from the one proposed by R (which I know to be the correct one):
solution = 1.9522 -0.6945
I also tried the trick of minimizing the square of the joint function outputs as follows:
solution = fminunc(@(x)sum(objective(x,A,B,T,Ve,r,D))^2,[0 0]);solution
But again, the result is not what I'm expecting:
solution = 5.2336 -0.70497
If I run the objective function with the roots proposed by R, there is what I obtain:
objective([9.818820 9.771408],A,B,T,Ve,r,D)ans = -2.1915e-07 -4.7316e-07
Maybe I'm using the wrong Matlab tools to solve this problem? Maybe I have to target a specific algorithm through options? Maybe I need to specify the Matlab objective function in a different way?
Any help will be really appreciated!
Best Answer