LU分解法(又名Doolittle分解法,直接三角分解法)C++实现

模板题
LU分解法(又名Doolittle分解法,直接三角分解法)C++实现_第1张图片两步:
(1)计算LU
(2)计算XY
复杂度依然为n^3级别,但运算量比高斯小

int n;
double a[222][222],b[222];
double u[222][222],l[222][222];
double y[222],x[222];
int get_lu()
{
    rpp(k,n) //求u的第k行,l的第 k列
    {
        for(int j=k;j<=n;++j)//u的第j列,l的第j行
        {
            u[k][j]=a[k][j];
            for(int t=1;t<k;++t) 
                u[k][j]-=l[k][t]*u[t][j];
            if(k==j&&!u[k][j]) return 0;
            if(j==k) l[j][k]=1;
            else
            {
                l[j][k]=a[j][k];
                for(int t=1;t<k;++t)
                    l[j][k]-=l[j][t]*u[t][k];
                l[j][k]/=u[k][k];
            }
        }
    }
    return 1;
}

//L*y=b
void get_y()
{
    rpp(i,n) 
    {
        y[i]=b[i];
        for(int j=1;j<i;++j) 
            y[i]-=l[i][j]*y[j];
    }
}
//U*x=y
void get_x()
{
    for(int i=n;i>=1;--i)
    {
        x[i]=y[i];
        for(int j=i+1;j<=n;++j)
            x[i]-=u[i][j]*x[j];
        x[i]/=u[i][i];
    }
}
signed main()
{
    cin>>n;
    rpp(i,n) 
    {
        rpp(j,n) cin>>a[i][j];
        cin>>b[i];
    }
    if(!get_lu()) cout<<"No Solution"<<endl;
    else
    {
        get_y();
        get_x();
        rpp(i,n) printf("%.2f\n", x[i]);
    }
    stop;
    return 0;
}

你可能感兴趣的:(计算方法)