加载中...

最小二乘法

给定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);
    }
}
posted @ 2022-08-18 16:40  liang302  阅读(224)  评论(0编辑  收藏  举报