【发布时间】:2020-08-18 21:51:19
【问题描述】:
我正在尝试求解 R 中的 n 个方程组。n-1 个方程是非线性的,最后一个是线性的。如果有帮助,这是一个受约束的优化问题,n-1 方程是一阶条件,最后一个是预算约束。 n-1个非线性方程可以表示为:non-linear equations
如果图像不显示,可以逐个元素地定义,例如:
v_i*epsilon_i*cos(2/pi * e_i/delta_i)-lambda=0
其中 epsilon、v、e 和 delta 是 n-1 维向量,而 lambda 是所有方程共有的标量。
最后一个方程是|e|=c 形式的简单线性方程。也就是说,e 中所有元素的总和是某个已知的 c,称为 parms[1,4] 或“预算”。
我有兴趣求解向量 e 和常数 lambda,将其他所有内容视为给定。
我尝试使用 rootSolve 的多根。为此,我定义了一个向量 X,它应该是向量 e,并附加了 lambda,以便多根求解 x,并将 n 个方程作为列表给出。所有参数都保存在一个名为“parms”的矩阵中
我先定义n-1个非线性方程
convex_focs <- function(x = numeric(),parms = numeric()){
deltas = parms[,1]
v = parms[,2]
lambda = x[1]
e = x[2:length(x)]
epsilon_2 = exp(parms[,3]) - parms[,1]
return(epsilon_2*cos((pi/2)*(e/deltas))-lambda)
}
这个等式使用矩阵表示法,并且本身就可以正常工作。 然后我定义了最后一个线性方程:
convex_budget <- function(x = numeric(),parms = numeric()){
e = x[2:length(x)]
return(sum(e)-parms[1,4])
}
然后我尝试convex_system <- function(x,parms) c(convex_focs,convex_budget ) 并致电:
multiroot(f = convex_system, maxiter = 500000, start = c(0,rep(budget/length(parms[,1]),length(parms[,1]))), parms = parms[,])
这当然行不通,因为 rootSolve 将 convex_system 识别为两个方程,但 X 识别为 n 维。
如果我放弃最后一个方程,并将 lambda 视为给定的(所以只求解非线性方程)我可以得到一个解决方案。但这当然不好,因为我不知道 lambda。
所以我的第一个问题是:
1. 如何从我的向量中生成一个 rootSolve 将识别为系统的函数列表?
我尝试使用 lapply 或使用小插图来创建convex_focs 方程的列表,向量中的每个 elememt 都有一个,但想不出一种使它起作用的方法。
2. 为什么它会将我原来的convex_focs 函数识别为方程组,但是当我添加convex_budget 时它停止工作?
然后我(绝望地......)尝试手动定义一组函数,只查看 3 个非线性函数,而不是 n-1 个函数。这样我的函数列表就会像 manual 和 other solutions I found online:
convex_system <- function(x,parms) c(F1 =
function(x =x,parms = parms){
deltas = parms[1,1]
v = parms[1,2]
lambda = x[1]
e = x[2]
epsilon_2 = exp(parms[1,3]) - parms[1,1]
return(v*epsilon_2*cos((pi/2)*(e/deltas))-lambda)
}
,
F2 =
function(x = x,parms = parms){
deltas = parms[2,1]
v = parms[2,2]
lambda = x[1]
e = x[3]
epsilon_2 = exp(parms[2,3]) - parms[2,1]
return(v*epsilon_2*cos((pi/2)*(e/deltas))-lambda)
}
,
F3 =
function(x = x,parms = parms){
deltas = parms[3,1]
v = parms[3,2]
lambda = x[1]
e = x[4]
epsilon_2 = exp(parms[3,3]) - parms[3,1]
return(v*epsilon_2*cos((pi/2)*(e/deltas))-lambda)
}
,
F_budget = function(x = x,parms = parms){
e = x[2:length(x)]
return(sum(e)-parms[1,4])}
)
然后打电话给multiroot(f = convex_system, maxiter = 500000, start = c(0,rep(budget/length(parms[1:3,1]),length(parms[1:3,1]))), parms = parms[1:3,])
当我运行它时,我得到了错误
stode(y, times, func, parms = parms, ...) 中的错误: REAL() 只能应用于“数字”,而不是“列表”
我真的不明白 - 函数列表怎么可能不是“列表”类? 所以我的第二个问题是:
- 当函数不是简单的单行函数(如上面链接中的函数)时,如何生成函数列表
最后,我非常感谢任何有关如何更好地解决 R 中此类问题的指导。
感谢您的帮助!
【问题讨论】:
标签: r optimization vector non-linear