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

如何使用R求解超定非线性方程组最优解并解决ktsolve报错问题

R超定非线性方程组最优解求解方案

报错原因分析

  • 函数定义错误:你定义的yfunc输入参数是x,但函数内部直接调用了a/b/c三个变量,没有将输入的参数值赋值给这三个变量,导致函数无法正确读取传入的猜测值
  • 工具选型不匹配:ktsolve默认仅支持方程数与未知数数量相等的适定方程组求解,你的场景是6个方程、3个未知数的超定方程组,需要求解最小二乘意义下的最优解,不适用ktsolve的默认配置

修正后的实现方案

直接用你已经加载的BB包的BBsolve函数即可,它原生支持超定非线性方程组的最小二乘最优解求解,修正后的完整可运行代码如下:

library(BB)
library(nleqslv)
library(reprex)
library(ktsolve)

yfunc<-function(x){
  # 将输入的参数向量拆解为a/b/c三个变量
  a <- x[1]
  b <- x[2]
  c <- x[3]
  y<-vector()
  y[1]<-a+b*sin((238.61/365)+c)-(39393*0.00341802+149-273.15)
  y[2]<-a+b*sin((1821.2/365)+c)-(38795*0.00341802+149-273.15)
  y[3]<-a+b*sin((1946.8/365)+c)-(38875*0.00341802+149-273.15)
  y[4]<-a+b*sin((2072.4/365)+c)-(39231*0.00341802+149-273.15)
  y[5]<-a+b*sin((2111.36/365)+c)-(38505*0.00341802+149-273.15)
  # 注意:此处分母为3650,和前面其他方程的分母365不一致,请自行核对是否为笔误
  y[6]<-a+b*sin((2223.12/3650)+c)-(37962*0.00341802+149-273.15)
  return(y)
}
# 猜测值改为向量格式,顺序对应a/b/c
guess <- c(a=8, b=15, c=30)
# 求解超定方程组最小二乘最优解
solv1 <- BBsolve(par=guess, fn=yfunc)

# 查看求解得到的a/b/c最优参数
print(solv1$par)
# 查看每个方程的残差,确认拟合效果
print(solv1$residual)

补充说明

如果拟合效果不符合预期,可以调整初始猜测值guess的数值后重新运行求解即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 23:39:04