我正在寻找一个固定点x
当函数的f(x)=x
,在数值上,但我不知道如何用R解决它,我正在尝试使用fsolve
下面的代码,但可能不是正确的方式来写这个...我没有得到任何东西......非常感谢提前
library(pracma)
p<- c(x=0.1, y=0.1)
f1 <- function(p) {
expPfLeft<- (160*p[1]) + ((1-p[1])*200)
expPfRight<- (10*p[1])+ ((1-p[1])*370)
expPfTop <- (200*p[2]) + ((1-p[2])*160)
expPfBottom <- (370*p[2]) + ((1-p[2])*10)
return(c (exp(2*expPfLeft)/((exp(2*expPfLeft)+exp(2*expPfRight))) ,
exp(2*expPfTop)/((exp(2*expPfTop))+(exp(2*expPfBottom))) ) )
}
fsolve(f1,p)
答案 0 :(得分:1)
假设您的功能已正确定义。您正在寻找f(p[1], p[2]) = c(p[1], p[2])
您可以通过将return语句更改为:
来创建修复答案 return(c(exp(2*expPfLeft)/((exp(2*expPfLeft)+exp(2*expPfRight))), exp(2*expPfTop)/((exp(2*expPfTop))+(exp(2*expPfBottom)))) - p)
我们可以观察到你的优化函数实际上是两个独立的函数。左,右使用p[1]
。顶部和底部使用p[2]
。
我们可以分开你的职能。
f.x <- function(p) {
expPfLeft<- (160*p) + ((1-p)*200)
expPfRight<- (10*p)+ ((1-p)*370)
return(exp(2*expPfLeft)/((exp(2*expPfLeft)+exp(2*expPfRight))) - p)
}
f.y <- function(p) {
expPfTop <- (200*p) + ((1-p)*160)
expPfBottom <- (370*p) + ((1-p)*10)
return(exp(2*expPfTop)/((exp(2*expPfTop))+(exp(2*expPfBottom))) - p)
}
简化你的表达,这样我们可以为起始值作弊一点
我们可以看到x = 1时只有一个近似近似解。
fsolve(f.x, 1)
$x
[1] 1
$fval
[1] 0
类似于第二个函数,有一个0.4689的解决方案。
fsolve(f.y, 0.1)
$x
[1] 0.4689443
$fval
[1] 4.266803e-09
这一切都违背了优化的目的,并让我相信你的优化功能是错误定义的。