最近在上计算方法这门课,要求是用MATLAB做练习题,但是我觉得C语言也很棒棒啊~

题目:


高斯消元法实际上可以看成是将系数矩阵A分解为一个单位上三角矩阵L和一个下三角矩阵U的乘积,当高斯消元无法使用的时候当然LU分解也不能用,只要A各阶顺序主子式不为0就行了。
使用VS2017,代码如下:

//使用LU分解法求解线性方程组
#include "stdafx.h"
#include<stdlib.h>
#include "math.h"double **A, *b, *x, *y, **L, **U;
unsigned int RANK = 4;
unsigned int makematrix()
{unsigned int r, c;printf("请输入矩阵行列数,用空格隔开:");scanf_s("%d %d", &r, &c);A = (double**)malloc(sizeof(double*)*r);//创建一个指针数组,把指针数组的地址赋值给a ,*r是乘以r的意思for (int i = 0; i < r; i++)A[i] = (double*)malloc(sizeof(double)*c);//给第二维分配空间for (int i = 0; i < r; i++) {for (int j = 0; j < c; j++)A[i][j] = 0.0;}b = (double*)malloc(sizeof(double)*r);for (int i = 0; i < r; i++){b[i] = 0.0;}x = (double*)malloc(sizeof(double)*c);for (int i = 0; i < c; i++){x[i] = 0.0;}L = (double**)malloc(sizeof(double*)*r);//创建一个指针数组,把指针数组的地址赋值给a ,*r是乘以r的意思for (int i = 0; i < r; i++)L[i] = (double*)malloc(sizeof(double)*c);//给第二维分配空间for (int i = 0; i < r; i++) {for (int j = 0; j < c; j++)L[i][j] = 0.0;}U = (double**)malloc(sizeof(double*)*r);//创建一个指针数组,把指针数组的地址赋值给a ,*r是乘以r的意思for (int i = 0; i < r; i++)U[i] = (double*)malloc(sizeof(double)*c);//给第二维分配空间for (int i = 0; i < r; i++) {for (int j = 0; j < c; j++)U[i][j] = 0.0;}y = (double*)malloc(sizeof(double)*c);for (int i = 0; i < c; i++){y[i] = 0.0;}return r;
}void getmatrix(void)//输入矩阵并呈现
{printf("请按行从左到右依次输入系数矩阵A,不同元素用空格隔开\n");for (int i = 0; i < RANK; i++){for (int j = 0; j<RANK; j++){scanf_s("%lf", &A[i][j]);}}printf("系数矩阵如下\n");for (int i = 0; i < RANK; i++){for (int j = 0; j<RANK; j++){printf("%g\t", A[i][j]);}printf("\n");}printf("请按从上到下依次输入常数列b,不同元素用空格隔开\n");for (int i = 0; i<RANK; i++){scanf_s("%lf", &b[i]);}printf("常数列如下\n");for (int i = 0; i<RANK; i++){printf("%g\t", b[i]);}printf("\n");
}void LUrush_calculation(void)//LU法解线性方程组
{double get_add=0.0;printf("利用以上A与b组成的增广阵进行LU分解法计算方程组\n");for (int i = 0; i < RANK; i++){U[0][i] = A[0][i];L[i][i] = 1;}for (int i = 1; i < RANK; i++){L[i][0] = A[i][0]/U[0][0];}for (int i = 1; i < RANK; i++){for (int j = 0; j<RANK; j++){if (i <= j){get_add = 0.0;for (int k = 0; k <= i - 1; k++) get_add = get_add + L[i][k] * U[k][j];U[i][j] = A[i][j] - get_add;}if (i < j){get_add = 0.0;for (int k = 0; k <= i - 1; k++) get_add = get_add + L[j][k] * U[k][i];L[j][i] = (A[j][i] - get_add) / U[i][i];}}}printf("由系数矩阵A得到的L U矩阵如下\n");for (int i = 0; i < RANK; i++){for (int j = 0; j<RANK; j++){printf("%g\t", L[i][j]);}        printf("\t\t");for (int j = 0; j<RANK; j++){printf("%g\t", U[i][j]);}     printf("\n");}printf("利用 Ly = d求解y,解得:\n");y[0] = b[0];for (int i = 1; i<RANK; i++){get_add = 0.0;for (int k = 0; k <= i - 1; k++) get_add = get_add + L[i][k] *y[k];y[i] = b[i] - get_add;}for (int i = 0; i<RANK; i++){printf("y%d = %g\n", i + 1, y[i]);}printf("利用 Ux = y求解x,解得:\n");x[RANK - 1] = y[RANK - 1] / U[RANK - 1][RANK - 1];for (int i = RANK - 2; i >= 0; i--){get_add = 0.0;for (int k = i+1; k <= RANK - 1; k++) get_add = get_add + U[i][k] * x[k];x[i] = (y[i] - get_add) / U[i][i];}for (int i = 0; i<RANK; i++){printf("x%d = %g\n", i + 1, x[i]);}printf("计算完成,按回车退出程序或按1重新输入矩阵\n");
}int main()
{
_again:RANK = makematrix();getmatrix();LUrush_calculation();getchar();if ('1' == getchar())goto _again;return 0;
}

按设计的提示老老实实 输入题目的系数矩阵和常数向量后,得到运行结果:

可以看出来,X4其实就是0,但是显示不是0,这并不是程序有问题,而是这就是直接法求线性方程组会失真的体现。

计算方法——C语言实现——LU分解法求解非线性方程相关推荐

  1. matlab lu解线性方程,MATLAB报告用LU分解法求解线性方程组.doc

    MATLAB报告用LU分解法求解线性方程组 <MATLAB>期末大报告 报告内容:用LU分解法求解线性方程组 学院(系): 专 业: 班 级: 学 号: 学生姓名: 2014 年 6 月 ...

  2. 解线性方程组的直接方法:LU分解法及其C语言算法实现

    在上一篇博客里面,笔者介绍了解线性方程组的列主元Guass消元法,这篇将介绍LU分解法及其算法实现. 什么是LU分解? 对于一个线性方程组Ax=b,其中A是非奇异系数矩阵,b是线性方程组右端项,在列主 ...

  3. 计算方法:列主元消去法,LU分解法, 雅可比迭代法,高斯塞德尔迭代法 解线性方程(C++)

    Matrix.h包括矩阵类Matrix的定义,Matrix.cpp包括该类成员函数的实现,LinearEqu.h包括线性方程类LinearEqu的定义,继承自Matrix类,其中solve()方法为列 ...

  4. 紧凑存储的杜利特尔分解法Doolittle(LU分解法)_解线性方程组的直接解法

    紧凑存储的杜利特尔分解法Doolittle(LU分解法)_解线性方程组的直接解法 标签:计算方法实验 /* 紧凑存储的杜利特尔分解法Doolittle:如果初始矩阵不要求保留的话,可以紧凑存储.因为每 ...

  5. Doolittle分解法(LU分解法)的Python实现

    在解一般的非奇异矩阵线性方程组的时候,或者在迭代改善算法中,需要使用LU分解法. 对于一个一般的非奇异矩阵A=(a11, a12,-,a1n,a21,-ann),可分解为一个下三角矩阵L和一个上三角矩 ...

  6. LU分解法 | matlab

    % LU分解法 % M为输入的增广矩阵 % precision为输入的精度要求,如不输入或输入有误,则默认为10位if nargin == 2trydigits(precision);catchdis ...

  7. Matlab | Lab4——用LU 分解法、 Jacobi 迭代、 Gauss-Seidel 迭代 解线性病态方程组(系数矩阵为Hilbert矩阵)

    1.要求 考虑线性方程组Hx=b,其中H为n阶Hilbert矩阵,即 通过先给定解(例如取x的各个分量为1),再计算出右端向量b的办法给出一个精确解已知的问题. (1)分别编写Doolittle LU ...

  8. Python02 雅克比迭代法 Gauss-Seidel迭代法 列选主元法 LU分解法(附代码)

    1. 实验结果 (1)在定义的矩阵类中设置需要求解的方程为: (2)在 test.py 中选择雅克比迭代法求解: 输入:最大容许迭代次数和精度要求: 输出:根据谱半径判断方法是否收敛,收敛时得到满足精 ...

  9. 数值分析3-解线性方程组的高斯消去法、LU分解法及列主元消去法的matlab程序和调试方法

    对于形如Ax=b的线性方程组,在线性代数中是通过求逆的方式求解的,即x=A-1b,而在数值分析中,解线性方程组的方法是通过直接法或者迭代法来实现的,今天写的三个程序都属于直接法,分别为高斯消去法.LU ...

  10. 计算机数值方法——LU分解法(C++\Python代码实现)

    算法流程 首先,LU分解法就是在高斯消元法的基础上,把矩阵AAA分解为一个上三角矩阵UUU与一个单位下三角矩阵LLL的乘积. 懒得敲LaTeX公式了,书上由具体的推导过程,这里我们重点介绍代码吧 主要 ...

最新文章

  1. Spark1.4 和 Hive 1.1.1 启动错误
  2. 根据传递函数仿真模拟滤波器的波特图(持续更新中)
  3. spring-boot中使用druid连接池
  4. mongodb集群分片环境搭建
  5. Win32 SDK - 打开文件对话框
  6. 电脑QQ登录后将显示的界面由“空间”改为“消息”
  7. PCL:三维点云概述(一)
  8. 小甲鱼python线下培训
  9. 把已有项目转换成Visual Studio的解决方案
  10. mysql之事务 锁(三)
  11. 数据库应用系统的生命周期
  12. GPON(计算机网络相关)
  13. 汉语教学备课工具推荐
  14. 使用certbot-auto脚本安装Certbot 生成https证书
  15. 鞋长度和欧美的标准宽度换算表
  16. 3D-LaneNet:端到端三维多车道检测ICCV2019
  17. android 解析json 日期格式,如何将JSON格式的日期字符串解析为日期格式
  18. 90后与老爸老妈斗智斗勇
  19. 在Redis上通过Easy Message Queue扩展微服务
  20. python3 zip破解

热门文章

  1. itext tif图片转为pdf
  2. win10计算机不显示usb,win10系统U盘不识别怎么办 没有显示U盘的解决方法
  3. Qt学习之Qt基础入门(上)
  4. 记录因安装npcap带来的无线连接上不了网的问题
  5. erphpdown9.2.7前台会员中心美化模板
  6. jszip压缩文件上传到服务器,2. jszip文件夹打包上传
  7. 完全干净卸载 iTunes 步骤
  8. 3Ds MAX 百度网盘免费下载
  9. 什么是干接点、湿接点、源型、漏型、NPN、PNP
  10. Matlab的dq变换模块到底选哪一种变换方式?90 degree behind phase A axis和 Aligned with phase A axis有什么区别?