[英]Get derivative in R
我正在嘗試采用表達式的派生形式:
x = read.csv("export.csv", header=F)$V1
f = expression(-7645/2* log(pi) - 1/2 * sum(log(w+a*x[1:7644]^2)) + (x[2:7645]^2/(w + a*x[1:7644]^2)),'a')
D(f,'a')
x只是一個整數向量,a和w是我試圖通過推導找到的變量。 但是,我得到了錯誤
“函數' [
'不在導數表中”
由於這是我第一次使用R,因此我現在一無所知。 我假設R在表達式內部的sum函數有問題嗎?
遵循建議后,我現在執行以下操作:
y <- x[1:7644]
z <- x[2:7645]
f = expression(-7645/2* log(pi) - 1/2 * sum(log(w+a*y^2)) + (z^2/(w + a*y^2)),'a')
派生這給我的錯誤是“和不在派生表中”。 如何確定表達式考慮y和z的每個值?
另一個更新:
y <- x[1:7644]
z <- x[2:7645]
f = expression(-7645/2* log(pi) - 1/2 * log(w+a*y^2) + (z^2/(w + a*y^2)))
d = D(f,'a')
uniroot(eval(d),c(0,1000))
我取消了“求和”功能,只輸入了y和z。 現在,有兩個問題:
a)我如何確定這仍然是預期的行為? b)Uniroot似乎不喜歡“ w”和“ a”,因為它們只是象征性的。 我將如何解決此問題? 我得到的錯誤是“找不到對象'w'”
這應該工作:
因為您有兩個要加f+g
,所以導數D(f+g) = D(f) + D(g)
,所以讓我們像這樣將兩者分開:
g = expression((z^2/(w + a*y^2)))
f = expression(- 1/2 * log(w+a*y^2))
看到從表達式f中刪除了sum()
,因為將乘法常數移到了sum()
,並且D(sum()) = sum(D())
。 由於導數為0,因此也刪除了第一常數。
所以:
D(sum(-7645/2* log(pi) - 1/2 * log(w+a*y^2)) + (z^2/(w + a*y^2)) = D( constant + sum(f) + g ) = sum(D(f)) + D(g)
哪個應該給:
sum(-(1/2 * (y^2/(w + a * y^2)))) + -(z^2 * y^2/(w + a * y^2)^2)
表達式只接受一個expr輸入,而不是一個向量,對它進行向量化已超出了能力。 您也可以使用for循環執行此操作:
foo <- c("1+2","3+4","5*6","7/8")
result <- numeric(length(foo))
foo <- parse(text=foo)
for(i in seq_along(foo))
result[i] <- eval(foo[[i]])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.