计算方法——C语言实现——LU分解法求解非线性方程
最近在上计算方法这门课,要求是用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分解法求解非线性方程相关推荐
- matlab lu解线性方程,MATLAB报告用LU分解法求解线性方程组.doc
MATLAB报告用LU分解法求解线性方程组 <MATLAB>期末大报告 报告内容:用LU分解法求解线性方程组 学院(系): 专 业: 班 级: 学 号: 学生姓名: 2014 年 6 月 ...
- 解线性方程组的直接方法:LU分解法及其C语言算法实现
在上一篇博客里面,笔者介绍了解线性方程组的列主元Guass消元法,这篇将介绍LU分解法及其算法实现. 什么是LU分解? 对于一个线性方程组Ax=b,其中A是非奇异系数矩阵,b是线性方程组右端项,在列主 ...
- 计算方法:列主元消去法,LU分解法, 雅可比迭代法,高斯塞德尔迭代法 解线性方程(C++)
Matrix.h包括矩阵类Matrix的定义,Matrix.cpp包括该类成员函数的实现,LinearEqu.h包括线性方程类LinearEqu的定义,继承自Matrix类,其中solve()方法为列 ...
- 紧凑存储的杜利特尔分解法Doolittle(LU分解法)_解线性方程组的直接解法
紧凑存储的杜利特尔分解法Doolittle(LU分解法)_解线性方程组的直接解法 标签:计算方法实验 /* 紧凑存储的杜利特尔分解法Doolittle:如果初始矩阵不要求保留的话,可以紧凑存储.因为每 ...
- Doolittle分解法(LU分解法)的Python实现
在解一般的非奇异矩阵线性方程组的时候,或者在迭代改善算法中,需要使用LU分解法. 对于一个一般的非奇异矩阵A=(a11, a12,-,a1n,a21,-ann),可分解为一个下三角矩阵L和一个上三角矩 ...
- LU分解法 | matlab
% LU分解法 % M为输入的增广矩阵 % precision为输入的精度要求,如不输入或输入有误,则默认为10位if nargin == 2trydigits(precision);catchdis ...
- Matlab | Lab4——用LU 分解法、 Jacobi 迭代、 Gauss-Seidel 迭代 解线性病态方程组(系数矩阵为Hilbert矩阵)
1.要求 考虑线性方程组Hx=b,其中H为n阶Hilbert矩阵,即 通过先给定解(例如取x的各个分量为1),再计算出右端向量b的办法给出一个精确解已知的问题. (1)分别编写Doolittle LU ...
- Python02 雅克比迭代法 Gauss-Seidel迭代法 列选主元法 LU分解法(附代码)
1. 实验结果 (1)在定义的矩阵类中设置需要求解的方程为: (2)在 test.py 中选择雅克比迭代法求解: 输入:最大容许迭代次数和精度要求: 输出:根据谱半径判断方法是否收敛,收敛时得到满足精 ...
- 数值分析3-解线性方程组的高斯消去法、LU分解法及列主元消去法的matlab程序和调试方法
对于形如Ax=b的线性方程组,在线性代数中是通过求逆的方式求解的,即x=A-1b,而在数值分析中,解线性方程组的方法是通过直接法或者迭代法来实现的,今天写的三个程序都属于直接法,分别为高斯消去法.LU ...
- 计算机数值方法——LU分解法(C++\Python代码实现)
算法流程 首先,LU分解法就是在高斯消元法的基础上,把矩阵AAA分解为一个上三角矩阵UUU与一个单位下三角矩阵LLL的乘积. 懒得敲LaTeX公式了,书上由具体的推导过程,这里我们重点介绍代码吧 主要 ...
最新文章
- Spark1.4 和 Hive 1.1.1 启动错误
- 根据传递函数仿真模拟滤波器的波特图(持续更新中)
- spring-boot中使用druid连接池
- mongodb集群分片环境搭建
- Win32 SDK - 打开文件对话框
- 电脑QQ登录后将显示的界面由“空间”改为“消息”
- PCL:三维点云概述(一)
- 小甲鱼python线下培训
- 把已有项目转换成Visual Studio的解决方案
- mysql之事务 锁(三)
- 数据库应用系统的生命周期
- GPON(计算机网络相关)
- 汉语教学备课工具推荐
- 使用certbot-auto脚本安装Certbot 生成https证书
- 鞋长度和欧美的标准宽度换算表
- 3D-LaneNet:端到端三维多车道检测ICCV2019
- android 解析json 日期格式,如何将JSON格式的日期字符串解析为日期格式
- 90后与老爸老妈斗智斗勇
- 在Redis上通过Easy Message Queue扩展微服务
- python3 zip破解
热门文章
- itext tif图片转为pdf
- win10计算机不显示usb,win10系统U盘不识别怎么办 没有显示U盘的解决方法
- Qt学习之Qt基础入门(上)
- 记录因安装npcap带来的无线连接上不了网的问题
- erphpdown9.2.7前台会员中心美化模板
- jszip压缩文件上传到服务器,2. jszip文件夹打包上传
- 完全干净卸载 iTunes 步骤
- 3Ds MAX 百度网盘免费下载
- 什么是干接点、湿接点、源型、漏型、NPN、PNP
- Matlab的dq变换模块到底选哪一种变换方式?90 degree behind phase A axis和 Aligned with phase A axis有什么区别?