r - 使用“nleqslv”包求解非线性方程
问题描述
我试图通过使用 nleqslv 来解决这些非线性方程。但是它不能很好地工作。我确实知道它不这样做的原因,因为我没有将两个未知数分开到等式的不同方面。
我的问题是:1,是否有其他软件包可以解决这种方程?2,R中是否有任何有效的方法可以帮助我重新排列方程,使其满足包nleqslv的要求?
感谢你们。
这是代码,p[1] 和 p[2] 是我要解决的两个未知数。
dslnex<-function(p){
p<-numeric(2)
0.015=sum(exp(Calib2$Median_Score*p[1]+p[2])*weight_pd_bad)
cum_dr<-0
for (i in 1:length(label)){
cum_dr[i]<-exp(Calib2$Median_Score*p[1]+p[2][1:i]*weight_pd_bad[1:i]/0.015
}
mid<-0
for (i in 1:length(label)){
mid[i]<-sum(cum_dr[1:i])/2
}
0.4=(sum(mid*weight_pd_bad)-0.5)/(0.5*(1-0.015))
}
pstart<-c(-0.000679354,-4.203065891)
z<- nleqslv(pstart, dslnex, jacobian=TRUE,control=list(btol=.01))
解决方案
跟进我的评论,我重写了您的功能,如下纠正错误和效率低下。错误和其他更改作为内联注释给出。
# no need to use dslnex as name for your function
# dslnex <- function(p){
# any valid name will do
f <- function(p) {
# do not do this
# you are overwriting p as passed by nleqslv
# p<-numeric(2)
# declare retun vector
y <- numeric(2)
y[1] <- 0.015 - (sum(exp(Calib2$Median_Score*p[1]+p[2])*weight_pd_bad))
# do not do this
# cum_dr is initialized as a scalar and will be made into a vector
# which will be grown as a new element is inserted (can be very inefficient)
# cum_dr<-0
# so declare cum_dr to be a vector with length(label) elements
cum_dr <- numeric(length(label))
for (i in 1:length(label)){
cum_dr[i]<-exp(Calib2$Median_Score*p[1]+p[2][1:i]*weight_pd_bad[1:i]/0.015
}
# same problem as above
# mid<-0
mid <- numeric(length(label))
for (i in 1:length(label)){
mid[i]<-sum(cum_dr[1:i])/2
}
y[2] <- 0.4 - (sum(mid*weight_pd_bad)-0.5)/(0.5*(1-0.015))
# return vector y
y
}
pstart <-c(-0.000679354,-4.203065891)
z <- nleqslv(pstart, dslnex, jacobian=TRUE,control=list(btol=.01))
nleqslv
用于求解f(x) = 0
必须为正方形的方程组。因此,函数必须返回一个与 -vector 大小相同的x
向量。
如果您的方程组有解,您现在应该能够继续。并且只要您的方程式中没有进一步的错误。我[1:i]
对表达式 forcum_dr
和表达式中的 有我的双打mid[i]
。循环计算mid
可能可以写成一条语句:mid <- cumsum(cum_dr)/2
. 由你决定。
推荐阅读
- arrayfire - ArrayFire af::eval() 过早的数据类型不匹配错误
- sql - 组合存储过程结果集
- intellij-idea - 在不创建项目的情况下使用 intellij 打开目录
- javascript - 连接嵌套对象数组的元素
- c# - 实例化后立即访问脚本组件
- android - Play 商店内部测试轨道,切换到直播
- javascript - 从Javascript中的新类内部回调中获取值
- codesandbox - 如何在codesandbox中为react+typescript+mobx添加装饰器支持?
- python - Pyreverse:生成 uml 报告时如何为方法和属性添加返回类型?
- javascript - 为什么 .toISOString() 给出不同的时间?