软件开发与创新课第一次作业-关于线性方程组求解的一些改进
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)改进效果
界面截图



浙公网安备 33010602011771号