用直接分解法求方程组的C语言程序,LU分解法解线性方程组(C语言)
#include
#include
#define N 10 //矩阵大小范围
/*
* 使用已经求出的x,向前计算x(供getx()调用)
* float a[][]矩阵U
* float x[]方程组解
* inti解的序号(数组X元素序号)
* intn矩阵大小
* return公式中需要的和
*/
float getmx(float a[N][N], float x[N], int i, int n)
{
float mx = 0;
int r;
for(r=i+1; r
{
mx += a[i][r] * x[r];
}
return mx;
}
/*
* 使用已经求出的y,向前计算y(供gety()调用)
* float a[][]矩阵L
* float y[]数组Y
* inti数组Y元素序号
* intn矩阵大小
* return公式中需要的和
*/
float getmy(float a[N][N], float y[N], int i, int n)
{
float my = 0;
int r;
for(r=0; r
{
if(i != r) my += a[i][r] * y[r];
}
return my;
}
/*
* 解方程组,计算某x
* float a[][]矩阵U
* float x[]方程组解
* inti解的序号
* intn矩阵大小
* return方程组的第i个解(数组X的第i个元素值)
*/
float getx(float a[N][N], float b[N], float x[N], int i, int n)
{
float result;
if(i==n-1) //计算最后一个x的值
result = (float)(b[i]/a[n-1][n-1]);
else //计算其他x值(对于公式中的求和部分,需要调用getmx()函数)
result = (float)((b[i]-getmx(a,x,i,n))/a[i][i]);
return result;
}
/*
* 解数组Y,计算其中一元素值
* float a[][]矩阵L
* float y[]数组Y
* inti数组Y元素序号
* intn矩阵大小
* return数组Y的第i个元素值
*/
float gety(float a[N][N], float b[N], float y[N], int i, int n)
{
float result;
if(i==0) //计算第一个y的值
result = float(b[i]/a[i][i]);
else //计算其他y值(对于公式中的求和部分,需要调用getmy()函数)
result = float((b[i]-getmy(a,y,i,n))/a[i][i]);
return result;
}
void main()
{
float l[N][N]={0}; //定义L矩阵
float u[N][N]={0}; //定义U矩阵
float y[N]={0}; //定义数组Y
float x[N]={0}; //定义数组X
float a[N][N]={{2,1,1},{1,3,2},{1,2,2}}; //定义系数矩阵
float b[N]={4,6,5}; //定义右端项
float sum=0;
int i,j,k;
int n=3;
int flag=1;
/*用户手工输入矩阵
while(flag)
{
printf("请输入系数矩阵的大小:");
scanf("%d", &n);
if(n>N){
printf("矩阵过大!/n");
continue;
}
flag=0;
}
printf("请输入系数矩阵值:/n");
for(i=0; i
{
for(j=0; j
{
printf("a[%d][%d]: ", i, j);
scanf("%f", &a[i][j]);
}
}
printf("请输入右端项数组:/n");
for(i=0; i
{
printf("b[%d]: ", i);
scanf("%f", &b[i]);
}*/
/*显示原始矩阵*/
printf("/n原始矩阵:/n");
for(i=0; i
{
for(j=0; j
printf("%0.3f ",a[i][j]);
printf("/n");
}
printf("/n/n");
/*初始化矩阵l*/
for(i=0; i
{
for(j=0; j
{
if(i==j) l[i][j] = 1;
}
}
/*开始LU分解*/
/*第一步:对矩阵U的首行进行计算*/
for(i=0; i
{
u[0][i] = (float)(a[0][i]/l[0][0]);
}
/*第二步:逐步进行LU分解*/
for(i=0; i
{
/*对“L列”进行计算*/
for(j=i+1; j
{
for(k=0,sum=0; k
{
if(k != i) sum += l[j][k]*u[k][i];
}
l[j][i] = (float)((a[j][i]-sum)/u[i][i]);
}
/*对“U行”进行计算*/
for(j=i+1; j
{
for(k=0,sum=0; k
{
if(k != i+1) sum += l[i+1][k]*u[k][j];
}
u[i+1][j] = (float)((a[i+1][j]-sum));
}
}
/*输出矩阵l*/
printf("矩阵L:/n");
for(i=0; i
{
for(j=0; j
{
printf("%0.3f ", l[i][j]);
}
printf("/n");
}
/*输出矩阵u*/
printf("/n矩阵U:/n");
for(i=0; i
{
for(j=0; j
{
printf("%0.3f ", u[i][j]);
}
printf("/n");
}
/*回代方式计算数组Y*/
for(i=0; i
{
y[i] = gety(l,b,y,i,n);
}
/*显示数组Y*/
printf("/n/n数组Y:/n");
for(i=0; i
{
printf("y%d = %0.3f/n", i+1,y[i]);
}
/*回代方式计算数组X*/
for(i=n-1; i>=0; i--)
{
x[i] = getx(u,y,x,i,n);
}
/*显示数组X*/
printf("/n/n数组X:/n");
for(i=0; i
{
printf("x%d = %0.3f/n", i+1,x[i]);
}
}
用直接分解法求方程组的C语言程序,LU分解法解线性方程组(C语言)相关推荐
- 用直接分解法求方程组的C语言程序,c语言编程求解线性方程组论文
计算机编程求解线性方程组 第一章 绪 论 在自然科学.工程技术.经济和医学各领域中产生的许多实际问题都可以通过数学语言描述为数学问题,也就是说,由实际问题建立数学模型,然后应用各种数学方法和技巧来求解 ...
- 分治法求金块问题java_十、用分治法求金块问题.doc
十.用分治法求金块问题.doc PAGE PAGE 31 十.用分治法求金块问题: 老板有一袋金块(共n块,n是2的幂(n>=2)),最优秀的雇员得到其中最重的一块,最差的雇员得到其中最轻的一块 ...
- c++分治法求最大最小值实现_程序员:算法导论,分治法、归并排序,伪代码和Java实现...
分治法 我们首先先介绍分治法.分治法的思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后在合并这些子问题的解来解决原问题的解. 还是拿扑克牌举例子,假设桌上有两堆牌面朝 ...
- c语言分治法求众数重数_算法实验二 分治法 众数问题.pdf
算法实验二 分治法 众数问题 算法分析与设计实验二 分治法 主要内容 • 实验目的 • 主要实验仪器设备和环境 • 实验内容 • 实验要求 • 注意点 实验目的 • 理解分治法的基本思想 • 针对特定 ...
- python的return语句求两数之和_程序题(python解)
PyCharm整理代码:Ctrl+Alt+l list行数:len(list) list列数:len(list[1]) 笔试常使用到的功能: 1.单独取出一长串字符中每个单独的字符: 输入'abcd' ...
- c语言程序 输入一个四位数,用c语言编程:输入一个四位数,求出它的个位、十位、百位、千位...
满意答案 QQ89748770 推荐于 2018.02.26 采纳率:45% 等级:13 已帮助:7318人 C代码:--------------------- int a; scanf(&qu ...
- c语言中奇数导通,多功能电脑时钟设计报告含正确C语言程序96分(58页)-原创力文档...
精品 多功能电脑时钟设计报告 一.实训目的意义及任务要求 1.1 目的意义 在如今,单片机的使用领域已十分广泛,它在智能仪器仪表.实时工控.通 讯设备.导航系统.家用电器等均有很广泛的应用. 单片机又 ...
- matlab特征值分解法求多自由度系统的固有频率和主振型
多自由度系统的固有频率和主振型可根据系统的无阻尼自由振动方程得到. MX˝+KX=0 设解为X=Ae^iωnt 可推出: 主振型方程(K-ωn^2M)A=0 (M^(-1)*K-ωn^2E)A=0 特 ...
- 乔列斯基分解法求线性方程组的MATLAB程序实现
编写的 乔列斯基分解算法的MATLAB 程序如下: 功能:LL分解法求线性方程组AX=b的解调用格式:[X,L]= SymPosl (A,b) 其中, A:线性方程组的系数矩阵: b:线性方程组的常数 ...
- Matlab | Lab4——用LU 分解法、 Jacobi 迭代、 Gauss-Seidel 迭代 解线性病态方程组(系数矩阵为Hilbert矩阵)
1.要求 考虑线性方程组Hx=b,其中H为n阶Hilbert矩阵,即 通过先给定解(例如取x的各个分量为1),再计算出右端向量b的办法给出一个精确解已知的问题. (1)分别编写Doolittle LU ...
最新文章
- OpenCV关于hog特征向量的个数
- Taxlive2020安装~新手向
- repository access denied. access via a deployment key is read-only.
- WSS 3.0中An unexpected error has occurred的一个解决方案
- 链表的基本操作 java_详细实现单链表的基本操作【Java版】
- 7-23 还原二叉树 (25 分)(分析加详解)
- 【POJ - 1028】 Web Navigation( 栈 or 模拟队列 )
- CentOS 安装以及配置Apache php mysql
- ThinkPHP3.2.3分页中文参数乱码问题及解决
- flume channel monitor实现源码分析
- 20复变函数的积分(六)
- 【知识点总结】jQuery的扩展方法
- 使用Jflash给华大半导体的MCU烧录程序
- 苹果cms后台登录验证码错误或显示不出来解决方法
- 用python生成密码本(不同模式不同密码)
- linux开机启动grub rescue,Ubuntu 开机出现 grub rescue 的模式下修复
- Objective-C简单的音乐播放器(边下边播)
- 无法连接imssage信息服务器,苹果iPhone X用iMessage发短信信息总是失败解决方法
- 通过虚拟机搭建个人NAS
- “不裁员的微软” 裁员了!网上哀嚎一片!