如何使用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
相关产品推荐
相关产品推荐

