R语言求解高度非线性方程组报错:结果长度与输入不匹配
错误修复与代码修正
核心问题分析
你遇到的Length of fn result <> length of x!错误,是因为nleqslv要求目标函数返回的向量长度必须和输入变量数量一致(这里是2个变量Le和c,需返回2个方程结果:Sum_F和Sum_M),而你的代码返回的是两个值的和(单个数值),长度不匹配。
具体修正点
- 修正返回值:将
return(sum(c(Sum_F,Sum_M)))改为return(c(Sum_F, Sum_M)),确保返回长度为2的向量。 - 拼写错误修正:将
epsilin_b改为epsilon_b(max_epsilon判断语句中)。 - 未定义变量替换:将
WF[i,"bf"]替换为bf(WF未在代码中定义,属于笔误)。
修正后的完整代码
library(nleqslv) Vn <- 1052.676 fc <- 4 epsilon_f <- 0.0035 epsilon_01 <- 0.002 epsilon_085 <- 0.0038 min_epsilon <- 0.0003 max_epsilon <- 0.0114 bf <- 15.4 g <- 48 fn <- function(x) { Le <- x[1] c <- x[2] # 约束c的范围 if(c > 0.75*Le) {c <- 0.75*Le} if(c < 0.1*Le) {c <- 0.1*Le} fmax <- 0.85*fc ff <- fmax - (0.15*fmax)*(epsilon_f - epsilon_01)/(epsilon_085 - epsilon_01) c1 <- c*(epsilon_01/epsilon_f) c2 <- c - c1 cf1 <- (2/3)*bf*fmax*c1 xbar_f1 <- (5/8)*c1 cf2 <- bf*0.5*(ff + fmax)*c2 xbar_f2 <- ((fmax + 2*ff)/(3*(fmax + ff)))*c2 epsilon_b <- epsilon_f*(Le - c)/c # 修正拼写错误:epsilin_b -> epsilon_b if(epsilon_b > max_epsilon) {epsilon_b <- max_epsilon} if(epsilon_b < min_epsilon) {epsilon_b <- min_epsilon} if(epsilon_b < epsilon_01){ cb1 <- bf*fmax*epsilon_b*(Le - c)*((1/epsilon_01) - epsilon_b/(3*epsilon_01^2)) xbar_b1 <- (((2/(3*epsilon_01)) - epsilon_b/(4*epsilon_01^2))/ ((1/epsilon_01) - epsilon_b/(3*epsilon_01^2)))*(Le - c) cb2 <- 0 xbar_b2 <- 0 } if(epsilon_b >= epsilon_01){ c4 <- Le - c - c1 # 替换未定义的WF[i,"bf"]为bf cb1 <- (2/3)*bf*fmax*c1 xbar_b1 <- (5/8)*c1 fb <- fmax - (0.15*fmax)*(epsilon_b - epsilon_01)/(epsilon_085 - epsilon_01) cb2 <- bf*0.5*(fb + fmax)*c4 xbar_b2 <- ((fmax + 2*fb)/(3*(fmax + fb)))*c4 } # 调试用输出(可保留或删除) show(c(Vn, bf, g, fc, 0.5*g, fmax, Le, c, ff, c1, cf1, xbar_f1, c2, cf2, xbar_f2, epsilon_b, fb, cb1, xbar_b1, c4, cb2, xbar_b2)) Sum_F <- -Vn - cb1 - cb2 + cf1 + cf2 Sum_M <- -Vn*(0.5*g + c) + cb1*xbar_b1 + cb2*(c1 + xbar_b2) + cf1*xbar_f1 + cf2*(c1 + xbar_f2) show(c(Sum_F, Sum_M)) # 返回长度为2的向量,对应两个方程 return(c(Sum_F, Sum_M)) } # 求解方程组 Le_c <- nleqslv(c(50, 25), fn) # 查看结果 print(Le_c)
额外说明
- 修正后的代码会返回满足Sum_F=0和Sum_M=0的Le和c值。
- 如果求解过程中出现收敛问题,可以尝试调整初始猜测值(
c(50,25))或使用nleqslv的其他参数(如method)。
内容的提问来源于stack exchange,提问作者bahram
相关产品推荐
相关产品推荐

