tectal 2017-04-10 08:34
浏览 2322

【求帮助】拉格朗日插值法-补值

setwd("C:/Users/DELL1/Desktop")

library(XLConnect)
missing_data<-XLConnect::readWorksheetFromFile(file = "./data/missing_data.xls",sheet = 1,header=F)

lagrange<-function(x,xi,yi){
n<-length(xi)
lage<-0
for(i in 1:n){
li<-1
for(j in 1:n){
if(i!=j)
li<-li*(x-xi[j])/(xi[i]-xi[j])
}
lage<-li*yi[i]+lage
}
return(lage)
}

missdata = missing_data

for(k in 1:3)
{
x = which(is.na(missing_data[,k]))
x1=c(0,x)
x2=c(x,nrow(missing_data))
x12 = x2-x1-1
xx1<-x12[1:(length(x12)-1)] #缺失值前面的行数
xx2<-x12[2:(length(x12))] #缺失值后面的行数

j = 1
for(m in x)
{
    if(xx1[j]>=5)        #空值前的判断
        xi<- (m-5):(m-1)
    else
        xi<-(m-xx1[j]):(m-1)

    if(xx2[j]>=5)          #空值后的判断
        xi<-c(xi,(m+1):(m+5))
    else
        xi<-c(xi,(m+1):(m+xx2[j]))

    yi=missing_data[xi,k]
    missdata[m,k]=lagrange(m,xi,yi) 
    print(c(m,missdata[m,k]))
    j =j+1
}

}

数据见下(无法上传附件,抱歉)

21*3的表格
235.8333 324.0343 478.3231
236.2708 325.6379 515.4564
238.0521 328.0897 517.0909
235.9063   514.89
236.7604 268.8324  
  404.048 486.0912
237.4167 391.2652 516.233
238.6563 380.8241  
237.6042 388.023 435.3508
238.0313 206.4349 487.675
235.0729    
235.5313 400.0787 660.2347
  411.2069 621.2346
234.4688 395.2343 611.3408
235.5 344.8221 643.0863
235.6354 385.6432 642.3482
234.5521 401.6234  
236 409.6489 602.9347
235.2396 416.8795 589.3457
235.4896   556.3452
236.9688   538.347

补充的值不对!!!

麻烦指出一下,谢谢

[1] 6.0000 237.1512
[1] 13.000 235.315
[1] 4.0000 203.4621
[1] 11.0000 237.3481
[1] 20 NA
[1] 21 NaN
[1] 5.0000 503.7444
[1] 8.0000 472.0948
[1] 11.0000 634.3942
[1] 17.0000 615.7713

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥50 切换TabTip键盘的输入法
    • ¥15 可否在不同线程中调用封装数据库操作的类
    • ¥15 微带串馈天线阵列每个阵元宽度计算
    • ¥15 keil的map文件中Image component sizes各项意思
    • ¥20 求个正点原子stm32f407开发版的贪吃蛇游戏
    • ¥15 划分vlan后,链路不通了?
    • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据
    • ¥15 Vue3 大型图片数据拖动排序
    • ¥15 Centos / PETGEM
    • ¥15 划分vlan后不通了