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

求解1.75阶方程的根:作物产量与氮吸收量函数的U值求解

问题分析与解决办法

几个核心问题先明确

  1. polyroot用错了:这个函数是用来计算多项式根的,必须传入多项式系数向量,你传的是自定义函数(closure类型),肯定报错;而且你的方程不是多项式(指数是1.75,非整数次幂),根本不该用它。
  2. 函数语法有问题:原函数最后一行少了一个闭合括号,而且变量大小写不一致(U_Crit和U_crit,R是大小写敏感的),会导致变量未定义错误。
  3. Y=14170是Y_max,理论对应U=U_max=198.38,求解时可以先验证这个点

步骤1:修正参数与函数定义

先把参数赋值,再修正函数的语法和变量大小写:

# 赋值所有参数
Y_crit <- 12327.9
U_crit <- 123.2790
Q <- 57.14286
p <- 0.75
U_max <- 198.38
Y <- 14170

# 修正后的目标函数:补全括号,统一变量大小写
fn <- function(U) {
  Y - Y_crit - Q * (U - U_crit) + (Q/(p+1)) * ((U - U_crit)/(U_max - U_crit))^(p+1) * (U_max - U_crit)
}

步骤2:用uniroot求解(适合非线性方程)

uniroot需要指定搜索区间,这里从U_crit到U_max就可以:

# 调用uniroot求解
result <- uniroot(fn, interval = c(U_crit, U_max))
# 输出解
cat("求解得到的U值:", result$root, "\n")

验证一下:把U_max代入函数,结果应该接近0,因为Y是Y_max,所以解会非常接近198.38。

步骤3:手动实现二分查找

如果要自己写二分查找,逻辑是在区间内不断缩小区间直到满足精度:

binary_search <- function(f, low, high, tol = 1e-6) {
  while (high - low > tol) {
    mid <- (low + high) / 2
    # 判断符号变化,缩小区间
    if (f(low) * f(mid) < 0) {
      high <- mid
    } else {
      low <- mid
    }
  }
  return((low + high)/2)
}

# 调用二分查找
u_sol <- binary_search(fn, U_crit, U_max)
cat("二分查找得到的U值:", u_sol, "\n")

内容的提问来源于stack exchange,提问作者Kartik Kamath

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 02:10:25