软件开发与创新课第一次作业-关于线性方程组求解的一些改进

1)博客介绍

代码是网上找的,本文编写语言以C为主。作为初学者,不足之处望各位大佬多多包涵,不吝指教。

2)原C语言线性方程组求解代码分析

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#pragma warning(disable : 4996)
#define N 5
/*以下程序为不选主元的三角分解法(Doolittle)*/
 int main()
{
    int i, j, k, s;
    float a[N][N] = { 0 }, L[N][N] = { 0 }, U[N][N] = { 0 }, sigma1, sigma2, b[N], y[N], x[N];
    /*为L主对角线元素赋1*/
    for (i = 0; i < N; i++)
    {
        L[i][i] = 1;
    }
    /*输入矩阵a*/
    for (i = 0; i < N; i++)
    {
        printf("请输入矩阵第%d行元素:\n", i + 1);
        for (j = 0; j < N; j++)
            scanf("%f", &a[i][j]);
    }
    /*计算U第一行的元素和L第一列的元素*/
    for (i = 0; i < N; i++)
    {
        U[0][i] = a[0][i];
        L[i][0] = a[i][0] / U[0][0];
    }
    for (k = 1; k < N; k++)
    {
        /*计算矩阵U*/
        for (j = k; j < N; j++)
        {
            sigma1 = 0;
            for (s = 0; s <= k - 1; s++)
                sigma1 += L[k][s] * U[s][j];
            U[k][j] = a[k][j] - sigma1;
        }
        /*计算矩阵L*/
        for (i = k; i < N; i++)
        {
            sigma2 = 0;
            for (s = 0; s <= k - 1; s++)
                sigma2 += L[i][s] * U[s][k];
            L[i][k] = (a[i][k] - sigma2) / U[k][k];
        }
    }
    /*输出矩阵L、U*/
    printf("a矩阵为:\n");
    for (i = 0; i < N; i++)
    {
        for (j = 0; j < N; j++)
            printf("%5.1f ", a[i][j]);
        printf("\n");
    }
    printf("L矩阵为:\n");
    for (i = 0; i < N; i++)
    {
        for (j = 0; j < N; j++)
            printf("%5.1f ", L[i][j]);
        printf("\n");
    }
    printf("U矩阵为:\n");
    for (i = 0; i < N; i++)
    {
        for (j = 0; j < N; j++)
            printf("%5.1f ", U[i][j]);
        printf("\n");
    }
    printf("请输入b矩阵\n", i + 1);
    for (i = 0; i < N; i++)
        scanf("%f", &b[i]);
    /*回代法求解方程组Ly=b*/
    for (i = 0; i < N; i++)
    {
        sigma1 = 0;
        for (k = 0; k <= i - 1; k++)
            sigma1 += L[i][k] * y[k];
        y[i] = b[i] - sigma1;
    }
    for (i = N - 1; i >= 0; i--)
    {
        sigma2 = 0;
        for (k = i + 1; k < N; k++)
            sigma2 += U[i][k] * x[k];
        x[i] = (y[i] - sigma2) / U[i][i];
    }
    printf("x为:\n");
    for (i = 0; i < N; i++)
        printf("%5.1f ", x[i]);
    printf("\n");
}
源码

 原作者直接定义N来控制线性方程的元数,接着分别定义a,L,U,b,y5个数组,为a数组手动赋值,赋值完成用三角分解法分别求出数组L与数组U

求完数组L,U,输入数组b,并根据数组b进行回代求值,最后得出方程组的解

3)存在问题

根据图片,不难看出程序存在几个问题

未提示a矩阵列数

未提示b矩阵类型与元数

4)改进方案

对于矩阵输入加以提示

 

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#pragma warning(disable : 4996)
#define N 5
/*以下程序为不选主元的三角分解法(Doolittle)*/
 int main()
{
    int i, j, k, s;
    float a[N][N] = { 0 }, L[N][N] = { 0 }, U[N][N] = { 0 }, sigma1, sigma2, b[N], y[N], x[N];
    /*为L主对角线元素赋1*/
    for (i = 0; i < N; i++)
    {
        L[i][i] = 1;
    }
    /*输入矩阵a*/
    for (i = 0; i < N; i++)
    {
        printf("请输入矩阵第%d行元素,元素个数为%d:\n", i + 1,N);
        for (j = 0; j<N; j++)
        {
            scanf("%f", &a[i][j]);
            
            
        }
    }
    /*计算U第一行的元素和L第一列的元素*/
    for (i = 0; i < N; i++)
    {
        U[0][i] = a[0][i];
        L[i][0] = a[i][0] / U[0][0];
    }
    for (k = 1; k < N; k++)
    {
        /*计算矩阵U*/
        for (j = k; j < N; j++)
        {
            sigma1 = 0;
            for (s = 0; s <= k - 1; s++)
                sigma1 += L[k][s] * U[s][j];
            U[k][j] = a[k][j] - sigma1;
        }
        /*计算矩阵L*/
        for (i = k; i < N; i++)
        {
            sigma2 = 0;
            for (s = 0; s <= k - 1; s++)
                sigma2 += L[i][s] * U[s][k];
            L[i][k] = (a[i][k] - sigma2) / U[k][k];
        }
    }
    /*输出矩阵L、U*/
    printf("a矩阵为:\n");
    for (i = 0; i < N; i++)
    {
        for (j = 0; j < N; j++)
            printf("%5.1f ", a[i][j]);
        printf("\n");
    }
    printf("L矩阵为:\n");
    for (i = 0; i < N; i++)
    {
        for (j = 0; j < N; j++)
            printf("%5.1f ", L[i][j]);
        printf("\n");
    }
    printf("U矩阵为:\n");
    for (i = 0; i < N; i++)
    {
        for (j = 0; j < N; j++)
            printf("%5.1f ", U[i][j]);
        printf("\n");
    }
    printf("请输入b矩阵,元素个数为%d的向量\n",N);
    for (i = 0; i < N; i++)
        scanf("%f", &b[i]);
    /*回代法求解方程组Ly=b*/
    for (i = 0; i < N; i++)
    {
        sigma1 = 0;
        for (k = 0; k <= i - 1; k++)
            sigma1 += L[i][k] * y[k];
        y[i] = b[i] - sigma1;
    }
    for (i = N - 1; i >= 0; i--)
    {
        sigma2 = 0;
        for (k = i + 1; k < N; k++)
            sigma2 += U[i][k] * x[k];
        x[i] = (y[i] - sigma2) / U[i][i];
    }
    printf("x为:\n");
    for (i = 0; i < N; i++)
        printf("%5.1f ", x[i]);
    printf("\n");
}
修改后源码

稍微修改了界面提示问题

5)改进效果

界面截图

 

posted @ 2022-03-01 23:32  智慧⑨号  阅读(57)  评论(0)    收藏  举报