我想得到一个非线性公式的答案,我的代码是这样的;
library(nleqslv)
fs1<-function(x){
y<-numeric(length(x))
q<-x[1]
f<-x[2]
tau=0.2;epsilon=9;t=1.2;gamma=0.3;w=0.5;eta=0.95;lambda=1.2
k1=q^(-epsilon)/(f*(q^(1-epsilon))+(1-f)*t^(1-epsilon))
k2=t*(t*q)^(-epsilon)/(f*(t*q)^(1-epsilon)+1-f)
k3=q*f*(1-tau)+lambda*tau*f*(q*f+1-f)/(lambda*f+1-f)
k4=(1-f)*(1-tau)+tau*(1-f)*(q*f+1-f)/(lambda*f+1-f)
kv1=(q^(1-gamma))*((f/(1-f))^(-gamma+w*(1-eta)))
kv2=((f*((t*q)^(1-epsilon))+1-f)/(f*(q^(1-epsilon))+(1-f)*(t^(1-epsilon))))^((w+1-gamma)/(1-epsilon))
kv3=((q*gamma*(1-tau)*(lambda*f+1-f)+lambda*tau*(q*f+1-f))/(gamma*(1-tau)*(lambda*f+1-f)+tau*(q*f+1-f)))^w
y[1]=k1*k3+k2*k4-1
y[2]=kv1*kv2*kv3-1
y
}
startx<-c(0.6,1.1)
result<-nleqslv(startx,fs1,control = list(allowSingular=T))
但错误如下:
Error in nleqslv(startx, fs1, control = list(allowSingular = T)) :
initial value of fn function contains non-finite values (starting at index=2)
Check initial x and/or correctness of function
下一步该怎么做?谢谢你的回答!
答案 0 :(得分:2)
您可以通过查看函数的起始值来解决问题。
在您的函数中,您有一个表达式(f/(1-f))^gamma
。 f
来自x[2]
;一开始就是1.1
。将其插入上面给出的表达式会产生NaN。
所以你的起始值是不正确的。
您需要x[2]
的起始值介于0和1之间。
所以这样做:
startx <- c(.5,.5)
result<-nleqslv(startx,fs1,control = list(allowSingular=TRUE))
result
有了这个结果
$x
[1] 1.0148741 0.5609061
$fvec
[1] -1.323552e-10 -6.190382e-12
$termcd
[1] 1
$message
[1] "Function criterion near zero"
$scalex
[1] 1 1
$nfcnt
[1] 18
$njcnt
[1] 1
$iter
[1] 13
最后对你的代码做了一些评论:
请使用TRUE
代替T
以避免混淆。
请在功能代码中的分配中使用<-
。
并使用更多空间。您的功能代码无法读取。