线性方程组的直接解法

列主元消去法和LU分解法

这里写图片描述

这里写图片描述

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1005;
const int inf = 0x3f3f3f3f;
typedef long long ll;
const ll linf = 1e18;
double matrix[maxn][maxn];
double x[maxn];
double b[maxn];
int n;
void change(int i, int j)
{
    double tmp;
    for (int k = 1; k <= n; k++)
    {
        tmp = matrix[i][k];
        matrix[i][k] = matrix[j][k];
        matrix[j][k] = tmp;
    }
    tmp = b[j];
    b[j] = b[i];
    b[i] = tmp;
}
void simp()
{
    for (int i = 1; i <= n; i++)
    {
        double t = 0;
        int index = 0;
        for (int j = i; j <= n; j++)
        {
            if (fabs(matrix[j][i])>fabs(t))
            {
                t = matrix[j][i];
                index = j;
            }
        }
        change(i, index);
        for (int j = i + 1; j <= n; j++)
        {
            double times = matrix[j][i] / t;
            for (int k = i; k <= n; k++)
            {
                matrix[j][k] = matrix[j][k] - times * matrix[i][k];
            }
            b[j] = b[j]-times * b[i];

        }
    }
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            printf("%lf\t", matrix[i][j]);
        }
        printf("%lf\n",b[i]);
    }
}
void solve()
{
    for (int i = n; i >= 1; i--)
    {
        double ans = b[i];
        for (int j = i+1; j <= n; j++)
        {
            ans -= matrix[i][j] * x[j];
        }
        x[i] = ans / matrix[i][i];
    }
    for (int i = 1; i <= n; i++)
    {
        cout << "x[" << i << "]= " << x[i] << endl;
    }
}
int main()
{

    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
    {

        for (int j = 1; j <= n; j++)
        {
            scanf("%lf", &matrix[i][j]);
        }
        scanf("%lf", &b[i]);
    }
    simp();
    solve();
    return 0;
}

这里写图片描述

这里写图片描述

#include <bits/stdc++.h>
using namespace std;
const int maxn=1005;
const int inf=0x3f3f3f3f;
typedef long long ll;
const ll linf=1e18;
double matrix[maxn][maxn];
double l[maxn][maxn];
double u[maxn][maxn];
double x[maxn];
double b[maxn];
double y[maxn];
int n;
void gety()
{
    y[1]=b[1];
    //cout<<y[1]<<endl;
    for(int i=2;i<=n;i++)
    {
        y[i]=b[i];
        for(int j=1;j<i;j++)
        {
            y[i]-=l[i][j]*y[j];
        }
        //cout<<y[i]<<endl;
    }
}
void getx()
{
    x[n]=y[n]/u[n][n];
    for(int i=n-1;i>=1;i--)
    {
        x[i]=y[i];
        for(int j=n;j>i;j--)
        {
            x[i]-=u[i][j]*x[j];
        }
        x[i]=x[i]/u[i][i];
    }
}
void getlu()
{
    memset(l,0,sizeof(l));
    memset(u,0,sizeof(u));
    for(int i=1;i<=n;i++)
        l[i][i]=1;
    for(int j=1;j<=n;j++)
    {
        u[1][j]=matrix[1][j];
    }
    for(int i=2;i<=n;i++)
    {
        l[i][1]=matrix[i][1]/u[1][1];
    }
    for(int r=2;r<=n;r++)
    {
        for(int j=r;j<=n;j++)
        {
            u[r][j]=matrix[r][j];
            for(int k=1;k<=r-1;k++)
            {
                u[r][j]-=l[r][k]*u[k][j];
            }
        }
        for(int i=r+1;i<=n;i++)
        {
            l[i][r]=matrix[i][r];
            for(int k=1;k<=r-1;k++)
            {
                l[i][r]-=l[i][k]*u[k][r];
            }
            l[i][r]/=u[r][r];
        }
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {

        for(int j=1;j<=n;j++)
        {
            scanf("%lf",&matrix[i][j]);
        }
        scanf("%lf",&b[i]);
    }
    getlu();
    printf("this is L:\n");
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            cout<<l[i][j]<<" ";
        }
        cout<<endl;
    }
    printf("this is U:\n");
        for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            cout<<u[i][j]<<" ";
        }
        cout<<endl;
    }
    gety();
    getx();
    cout<<endl;
    for(int i=1;i<=n;i++)
    {
        cout<<"X["<<i<<"]="<<x[i]<<endl;
    }
    return 0;
}

这里写图片描述

猜你喜欢

转载自blog.csdn.net/becky_w/article/details/80320187
今日推荐