最小二乘法
给定a[i]求让a2[i]构造成等差数列 要求sum(a[i]-a2[i])^2的值最小
https://ac.nowcoder.com/acm/contest/33187/J
转化成最小二乘法 (i,ai) 通过最小二乘法求出k,b构成的直线方程 y=kx+b 求是要变成的等差数列
long long t,n,a[N];
int main()
{
t=read();
while(t--)
{
n=read();
for(long long i=1;i<=n;i++) a[i]=read();
long double sumx=0,sumy=0,da=0,db=0,dc=0,dd=0,A=0,B=0,res=0;
for(long long i=1;i<=n;i++) sumx+=i,sumy+=a[i],da+=i*a[i],dc+=i*i;
db=sumx*sumy/n,dd=sumx*sumx/n;
A=(da-db)/(dc-dd);//公式a
B=sumy/n-A*sumx/n;//公式b
for(long long i=1;i<=n;i++) res+=(A*i+B-a[i])*(A*i+B-a[i]);
printf("%.12Lf\n",res);
}
}