我正在尝试求解 R 中的 n 个方程组。n-1 个方程是非线性的,最后一个是线性的。如果有帮助,这是一个受约束的优化问题,n-1 方程是一阶条件,最后一个是预算约束。n-1 个非线性方程组可以表征为:非线性方程组
如果图像未显示,则可以逐个元素地定义它,例如:
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。这样我的功能列表将看起来像我在网上找到的手册和其他解决方案:
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 中这些类型问题的任何指导。
感谢您的任何帮助!