网上有类似的程序,但是我觉得都不完美,于是自己参考现有的代码,写了一个自己满意的。
//拉格朗日内插,n为阶数,fx,fy为整体,函数内部会对其筛选,fx,fy长度>=n function lagrange2(fx,fy: array of Extended; xx: Extended; n: Integer): Extended; var i,j: Integer; yy: Extended; a: array of Extended; fx2,fy2: array of Extended; sum1,st_n,half_n: Integer; len: Integer; begin SetLength(a,n+1); SetLength(fx2,n+1); SetLength(fy2,n+1); sum1 := 0; half_n := n div 2; len := Length(fx)-1; //在这里是95 //===================BEGIN=========取nn个数参与插值,使要求的数在其中间======== st_n := Trunc(xx-fx[0]) div (15*60); //时间处于第几个15分钟 if(st_n>=len) then //超出所有 begin for j := len-n to len do begin fx2[sum1] := fx[j]; fy2[sum1] := fy[j]; sum1 := sum1+1; end; end else if(st_n<=0) then //低于所有 begin for j := 0 to n do begin fx2[sum1] := fx[j]; fy2[sum1] := fy[j]; sum1 := sum1+1; end; end else if(len-st_n< half_n) then //右边不够 begin for j := st_n to len do begin fx2[sum1] := fx[j]; fy2[sum1] := fy[j]; sum1 := sum1+1; end; for j := (len-n+1) to st_n do begin fx2[sum1] := fx[j-1]; fy2[sum1] := fy[j-1]; sum1 := sum1+1; end; end else if(st_n<(n div 2)) then //左边不够 begin for j := 0 to st_n do begin fx2[sum1] := fx[j]; fy2[sum1] := fy[j]; sum1 := sum1+1; end; for j := (st_n+1) to (n) do begin fx2[sum1] := fx[j]; fy2[sum1] := fy[j]; sum1 := sum1+1; end; end else //两边都够 begin for j := (st_n-(n div 2)) to st_n do begin fx2[sum1] := fx[j]; fy2[sum1] := fy[j]; sum1 := sum1+1; end; for j := (st_n+1) to (st_n+n-(n div 2)) do begin fx2[sum1] := fx[j]; fy2[sum1] := fy[j]; sum1 := sum1+1; end; end; //========================END======取nn个数参与插值,使要求的数在其中间======== yy := 0; for I := 0 to n do begin a[i] := fy2[i]; for j := 0 to n do begin if(j<>i) then a[i] := a[i]*(xx-fx2[j])/(fx2[i]-fx2[j]); end; yy := yy+a[i]; end; Result := yy; end;