You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言求解高度非线性方程组报错:结果长度与输入不匹配

错误修复与代码修正

核心问题分析

你遇到的Length of fn result <> length of x!错误,是因为nleqslv要求目标函数返回的向量长度必须和输入变量数量一致(这里是2个变量Le和c,需返回2个方程结果:Sum_F和Sum_M),而你的代码返回的是两个值的和(单个数值),长度不匹配。

具体修正点

  1. 修正返回值:将return(sum(c(Sum_F,Sum_M)))改为return(c(Sum_F, Sum_M)),确保返回长度为2的向量。
  2. 拼写错误修正:将epsilin_b改为epsilon_b(max_epsilon判断语句中)。
  3. 未定义变量替换:将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 21:07:14