我正在重新编写一个算法,我在R ++中用C ++实践,称为有限差分法。我对R很新,所以我不知道有关向量/矩阵乘法的所有规则。出于某种原因,当我这样做时,我得到一个不符合的参数错误:
ST_u <- matrix(0,M,1)
ST_l <- matrix(0,M,1)
for(i in 1:M){
Z <- matrix(gaussian_box_muller(i),M,1)
ST_u[i] <- (S0 + delta_S)*exp((r - (sigma*sigma)/(2.0))*T + sigma*sqrt(T)%*%Z)
ST_l[i] <- (S0 - delta_S)*exp((r - (sigma*sigma)/(2.0))*T + sigma*sqrt(T)%*%Z)
}
我收到此错误:
Error in sqrt(T) %*% Z : non-conformable arguments
以下是我的全部代码:
gaussian_box_muller <- function(n){
theta <- runif(n, 0, 2 * pi)
rsq <- rexp(n, 0.5)
x <- sqrt(rsq) * cos(theta)
return(x)
}
d_j <- function(j, S, K, r, v,T) {
return ((log(S/K) + (r + (-1^(j-1))*0.5*v*v)*T)/(v*(T^0.5)))
}
call_delta <- function(S,K,r,v,T){
return (S * dnorm(d_j(1, S, K, r, v, T))-K*exp(-r*T) * dnorm(d_j(2, S, K, r, v, T)))
}
Finite_Difference <- function(S0,K,r,sigma,T,M,delta_S){
ST_u <- matrix(0,M,1)
ST_l <- matrix(0,M,1)
for(i in 1:M){
Z <- matrix(gaussian_box_muller(i),M,1)
ST_u[i] <- (S0 + delta_S)*exp((r - (sigma*sigma)/(2.0))*T + sigma*sqrt(T)%*%Z)
ST_l[i] <- (S0 - delta_S)*exp((r - (sigma*sigma)/(2.0))*T + sigma*sqrt(T)%*%Z)
}
Delta <- matrix(0,M,1)
totDelta <- 0
for(i in 1:M){
if(ST_u[i] - K > 0 && ST_l[i] - K > 0){
Delta[i] <- ((ST_u[i] - K) - (ST_l[i] - K))/(2*delta_S)
}else{
Delta <- 0
}
totDelta = totDelta + exp(-r*T)*Delta[i]
}
totDelta <- totDelta * 1/M
Var <- 0
for(i in 1:M){
Var = Var + (Delta[i] - totDelta)^2
}
Var = Var*1/M
cat("The Finite Difference Delta is : ", totDelta)
call_Delta_a <- call_delta(S,K,r,sigma,T)
bias <- abs(call_Delta_a - totDelta)
cat("The bias is: ", bias)
cat("The Variance of the Finite Difference method is: ", Var)
MSE <- bias*bias + Var
cat("The marginal squared error is thus: ", MSE)
}
S0 <- 100.0
delta_S <- 0.001
K <- 100.0
r <- 0.05
sigma <- 0.2
T <- 1.0
M <- 10
result1 <- Finite_Difference(S0,K,r,sigma,T,M,delta_S)
我似乎无法弄清楚问题,任何建议都会非常感激。
答案 0 :(得分:3)
在R中, var imageArray = [UIImage]()
override func viewDidLoad() {
super.viewDidLoad()
if let stringImage = self.imageNames {
let imageRef = storage.reference(forURL: "gs://gsignme-14416.appspot.com/images/\(stringImage)")
imageRef.data(withMaxSize: 25 * 1024 * 1024, completion: { (data, error) -> Void in
if error == nil {
self.ImageOne = UIImage(data: data!)!
imageArray.append(self.ImageOne)
}else {
print("Error downloading image:" )
}
self.carouselView.reloadData()
self.carouselView.type = .rotary
if let stringImages = self.imagesTwo {
let imageRefs = self.storage.reference(forURL: "gs://gsignme-14416.appspot.com/images/\(stringImages)")
imageRefs.data(withMaxSize: 25 * 1024 * 1024, completion: { (data, error) -> Void in
if error == nil {
self.ImageTwo = UIImage(data: data!)!
imageArray.append(self.ImageTwo)
}else {
print("Error downloading image:" )
}
self.carouselView.reloadData()
self.carouselView.type = .rotary
})}
if let stringImage3 = self.imagesThree {
let imageRef = self.storage.reference(forURL: "gs://gsignme-14416.appspot.com/images/\(stringImage3)")
imageRef.data(withMaxSize: 25 * 1024 * 1024, completion: { (data, error) -> Void in
if error == nil {
self.ImageThree = UIImage(data: data!)!
imageArray.append(self.ImageThree)
}else {
print("Error downloading image:" )
}
self.carouselView.reloadData()
self.carouselView.type = .rotary
})}
if let stringImage4 = self.imagesFour {
let imageRef = self.storage.reference(forURL: "gs://gsignme-14416.appspot.com/images/\(stringImage4)")
imageRef.data(withMaxSize: 25 * 1024 * 1024, completion: { (data, error) -> Void in
if error == nil {
self.ImageFour = UIImage(data: data!)!
imageArray.append(self.ImageFour)
}else {
print("Error downloading image:" )
}
self.carouselView.reloadData()
self.carouselView.type = .rotary
})}
if let stringImage5 = self.imagesFive {
// AppDelegate.instance().showActivityIndicator()
let imageRef = self.storage.reference(forURL: "gs://gsignme-14416.appspot.com/images/\(stringImage5)")
imageRef.data(withMaxSize: 25 * 1024 * 1024, completion: { (data, error) -> Void in
if error == nil {
// AppDelegate.instance().dismissActivityIndicator()
self.ImageFive = UIImage(data: data!)!
imageArray.append(self.ImageFive)
}else {
print("Error downloading image:" )
}
self.carouselView.reloadData()
self.carouselView.type = .rotary
})}
})
}
func carousel(_ carousel: iCarousel, viewForItemAt index: Int, reusing view: UIView?) -> UIView {
var imageView: UIImageView!
if view == nil {
imageView = UIImageView(frame: CGRect(x: 20, y: 0, width: 250, height: 270))
// imageView.backgroundColor = UIColor.lightGray
imageView.contentMode = .scaleAspectFit
imageView.clipsToBounds = true
carousel.clipsToBounds = true
}else{
imageView = view as! UIImageView
}
imageView.image = imageArray[index]
imageArray.removeAll()
return imageView
}
运算符保留用于乘以两个适形矩阵。作为一种特殊情况,如果向量可以被视为符合矩阵的行或列向量,您也可以使用它将向量乘以矩阵(反之亦然);作为第二种特殊情况,它可以用来乘以两个向量来计算它们的内积。
然而,不能做的一件事就是执行标量乘法。向量或矩阵的标量乘法始终使用普通%*%
运算符。具体而言,在表达式*
中,第一项sqrt(T) %*% Z
是标量,第二项sqrt(T)
是矩阵。如果你打算在这里做的是将矩阵Z
乘以标量Z
,那么这应该写成sqrt(T)
。
当我进行此更改时,由于另一个错误 - sqrt(T) * Z
被使用但从未定义过,您的程序仍然无效 - 但我不太了解您的算法以尝试修复。< / p>
该计划的其他一些评论与您原来的问题没有直接关系:
S
中的第一个循环看起来很可疑:Finite_Difference
生成一个长度为guassian_box_muller(i)
的向量,i
在i
的循环中变化到1
,并将这些向量强制转换为长度为M
的列矩阵以生成M
可能无法执行您想要的操作。它将“重用”循环中的值以填充矩阵。试试这些看看我的意思:
Z
您还可以在许多地方使用循环,其中R的向量操作更容易阅读,并且(通常)执行速度更快。例如,您对matrix(gaussian_box_muller(1),10,1) # all one value
matrix(gaussian_box_muller(3),10,1) # cycle of three values
的定义等同于:
Var
并且Var <- sum((Delta - totDelta)^2)/M
和Delta
的定义也可以用这种简化的方式编写。
我建议谷歌搜索“r中的矢量和矩阵运算”或类似的东西并阅读一些教程。矢量算术特别是惯用R,你需要尽早学习并经常使用它。
您可能会发现考虑totDelta
函数生成随机高斯是有帮助的。
快乐的R-ing!