#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
using namespace std;
#define N 20 double A[N][N],L[N][N],U[N][N],b[N],Y[N],X[N]; /// -------------------------------------------------------------------------文件处理
void saveLU(int n)
{
for(int i=; i<n; i++) {
for(int j=; j<n; j++) {
cout<<L[i][j]<<" ";
}
cout<<endl;
}
cout<<endl<<endl;
for(int i=; i<n; i++) {
for(int j=; j<n; j++) {
cout<<U[i][j]<<" ";
}
cout<<endl;
}
} void saveT(double arr[], int n)
{
for(int i=; i<n; i++) {
cout<<arr[i]<<" ";
}
cout<<endl<<endl;
} ///-------------------------------------------------------------------------初始化
void init(int n)
{
freopen("input.txt","r",stdin);
freopen("lu.txt","w",stdout);
for(int i=; i<n; i++) {
for(int j=; j<n; j++) {
cin>>A[i][j];
}
}
for(int i=; i<n; i++) {
cin>>b[i];
}
} ///-------------------------------------------------------------------------直接法分解LU
void breakdown(int n)
{
for (int i=; i<n; i++) {
U[][i] = A[][i]; ///U 第一行
L[i][] = A[i][]/U[][]; ///L 第一列
}
///U 第R行 L 第R列
double tmp = ;
for (int r=; r<n; r++) {
for (int i=r; i<n; i++) {
tmp = A[r][i];
for(int k=;k<=r-; k++) {
tmp -= L[r][k]*U[k][i];
}
U[r][i] = tmp;
tmp =A[i][r];
for(int k=; k<=r-; k++) {
tmp -= L[i][k]*U[k][r];
}
L[i][r] = tmp/U[r][r];
}
} } ///-------------------------------------------------------------------------直接法计算Y
void computeY(int n)
{
Y[]=b[]; ///自上往下
for (int i=; i<n; i++) {
Y[i] = b[i];
for (int j=; j<=i-; j++) {
Y[i] -= L[i][j]*Y[j];
}
}
}
///-------------------------------------------------------------------------直接法计算X
void computeX(int n)
{
int con = n;
n--;
X[n] = Y[n]/U[n][n]; ///自下往上 for (int i=n-; i>=; i--) {
X[i] = Y[i];
for (int k=i+; k<con; k++) {
X[i] -= U[i][k]*X[k];
}
X[i]/=U[i][i];
}
} ///追赶法解三对角矩阵方程组{1.三对角矩阵LU分解 2.求y 3.求x }
///-------------------------------------------------------------------------1. LU分解
void TriangleBreakdown(int n)
{
for (int i=; i<n; i++) { /// L的下对角线 U的主对角线可直接得出
U[i][i] = ;
if(i+ < n)
L[i+][i] = A[i+][i];
}
L[][] = A[][];
U[][] = A[][]/L[][];
for (int i=; i<n; i++) { ///L的下对角线 U的上对角线
L[i][i] = A[i][i] - L[i][i-] * U[i-][i];
if(i+ < n)
U[i][i+] = A[i][i+]/L[i][i];
}
}
///------------------------------------------------------------------------- 计算X
void TriangleY(int n)
{
Y[] = b[]/A[][];
for (int i=; i<n; i++) {
Y[i] = (b[i]-A[i][i-]*Y[i-])/L[i][i];
}
}
///-------------------------------------------------------------------------计算Y
void TriangleX(int n)
{
X[n-] = Y[n-];
for (int i=n-; i>=; i--) {
X[i] = Y[i] - U[i][i+] * X[i+];
}
} ///------------------------------------------------------三种方法整合
double AB[N][N+];
void swap_cols(int x, int y, int n) ///交换两行
{
double tmp = ;
for(int i=; i<n+; i++) {
tmp = AB[x][i];
AB[x][i] = AB[y][i];
AB[y][i] = tmp;
}
}
int find_max_col(int x, int n) /// 此列下方最大值
{
double max1 = fabs(AB[x][x]);
int res = x;
for(int i=x+; i<n; i++) {
if(fabs(AB[i][x]) > max1) {
max1 = AB[i][x];
res = i;
}
}
return res;
}
void compute_gauss_X(int n) ///计算结果X
{
if(AB[n-][n-] == )
cerr<<"wrong: divide 0 \n";
X[n-] = AB[n-][n]/AB[n-][n-];
double tmp =;
for(int i=n-; i>=; i--) {
tmp = AB[i][n];
for(int j=i+; j<n; j++){
tmp -= X[j]* AB[i][j];
//if(fabs(tmp)<10e-6) tmp = 0;
}
if(AB[i][i] != )
X[i] = tmp/AB[i][i];
}
}
void solution_gauss(int n)/// 列主元高斯消元
{
for(int i=; i<n; i++) {
for(int j=; j<n; j++ ) {
AB[i][j] = A[i][j];
}
AB[i][n] = b[i];
}
int pos = ;
double m = ;
for(int i=; i<=n; i++) { ///标准行
pos =find_max_col(i, n);
if( pos != i){
swap_cols(i, pos, n);
}
for(int i=; i<n; i++) {
for(int j=; j<n+; j++) {
cout<<AB[i][j]<<" ";
}
cout<<endl;
}
cout<<"****************************\n";
for(int j=i+; j<n; j++) { ///标准行以下
m = AB[j][i] / AB[i][i];
for(int k=i; k<n+; k++) { ///此行所有数据
AB[j][k] -= m*AB[i][k];
}
}
cout<<"step# "<<i<<" :\n--------------------------\n";
for(int i=; i<n; i++) {
for(int j=; j<n+; j++) {
cout<<AB[i][j]<<" ";
}
cout<<endl;
}
cout<<"----------------------------\n\n\n";
}
compute_gauss_X(n);
saveT(X,n);
} void solution_LU(int n) ///直接法LU
{
breakdown(n);
computeY(n);
computeX(n); saveLU(n);
saveT(Y,n);
saveT(X,n);
} void solution_triangle_chase(int n) ///追赶法
{
TriangleBreakdown(n);
TriangleY(n);
TriangleX(n); saveT(Y,n);
saveT(X,n);
} int main()
{
int n = ,choise=;
cout<<"选择方法: 1.Gauss 2.direct LU 3.triangle chase : \t\t";
cin>>choise;
cout<<"输入矩阵大小\n";
cin>>n;
init(n);
switch(choise)
{
case : solution_gauss(n);break;
case : solution_LU(n); break;
case : solution_triangle_chase(n);
}
return ;
}

计算方法 -- 解线性方程组直接法(LU分解、列主元高斯消元、追赶法)的更多相关文章

  1. USACO 3.2 ratios 高斯消元

    题目原意很简单,就是解一个三元一次方程组 直接高斯消元解方程组,枚举最后一列的倍数(k) 注意double的精度,有很多细节需要处理 /* PROB:ratios LANG:C++ */ #inclu ...

  2. 【高斯消元】BZOJ 1770: [Usaco2009 Nov]lights 燈

    Description 貝希和她的閨密們在她們的牛棚中玩遊戲.但是天不從人願,突然,牛棚的電源跳閘了,所有的燈都被關閉了.貝希是一個很膽小的女生,在伸手不見拇指的無盡的黑暗中,她感到驚恐,痛苦與絕望. ...

  3. bzoj 1013 [JSOI2008]球形空间产生器sphere(高斯消元)

    1013: [JSOI2008]球形空间产生器sphere Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3584  Solved: 1863[Subm ...

  4. Matrix 高斯消元Gaussian elimination 中的complete pivoting和partial pivoting

    首先科普下Pivoting的含义 一般翻译为“主元”,在对矩阵做某种算法时,首先进行的部分元素.在线性规划的单纯形法中常见.wiki的解释如下:Pivot element(the first elem ...

  5. BZOJ1013球形空间产生器sphere 高斯消元

    @[高斯消元] Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球 面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球 ...

  6. 座位安排(欧拉回路,高斯消元,bitset)

    题面 由于旋转大师 F r e n c h \rm French French 的离去, A r e x t r e \rm Arextre Arextre 光荣地承担了给全班换座位的重任. 由于这是 ...

  7. 题解【AcWing883】高斯消元解线性方程组

    题面 高斯消元模板题. 这里直接讲述一下高斯消元的算法流程: 枚举每一列 \(c\): 找到第 \(c\) 列绝对值最大的一行: 将这一行换到最上面: 将该行的第一个数变成 \(1\): 将下面所有行 ...

  8. hdu 5755(高斯消元——模线性方程组模板)

    PS. 看了大神的题解,发现确实可以用m个未知数的高斯消元做.因为确定了第一行的情况,之后所有行的情况都可以根据第一行推. 这样复杂度直接变成O(m*m*m) 知道了是高斯消元后,其实只要稍加处理,就 ...

  9. POJ2947Widget Factory(高斯消元解同模方程)

    http://poj.org/problem?id=2947 题目大意:有n 种装饰物,m 个已知条件,每个已知条件的描述如下:p start enda1,a2......ap (1<=ai&l ...

随机推荐

  1. Java中switch可以接收的数据类型

    Java支持的数据类型有五种 他们分别是: byte.char.short.int.enum: 以上是JDK1.6以前的版本. JDK1.7时,又增加了String, public class Tes ...

  2. wamp上能够访问jsp(未解决 游客勿看)

    Windows下使用apache的jk_mod连接WAMP和Tomcat 发表于 2013 年 4 月 29 日 由 www.tonitech.com的站长 | 暂无评论 | Apache,Windo ...

  3. IT小小鸟阅读笔记

    人生就像是一艘漂泊的船,你努力滑行了就会找到成功的彼岸,否则就漂泊一生.在这个物欲横流的时代有太多的诱惑使我们静不下心来,但是我们应该时时刻刻警醒自己要做一些对自己成长有意义的事,程序员虽然幸苦但是作 ...

  4. (十)Jmeter中的Debug Sampler介绍

    一.Debug Sampler介绍: 使用Jmeter开发脚本时,难免需要调试,这时可以使用Jmeter的Debug Sampler,它有三个选项:JMeter properties,JMeter v ...

  5. mysql中用户和权限

    用户管理 用户数据所在位置: mysql中的所有用户,都存储在系统数据库(mysql)中的user 表中——不管哪个数据库的用户,都存储在这里. 表初始内容如下: 创建用户: 形式: create   ...

  6. Oracle schema 的含义

    方案(Schema)为数据库对象的集合,为了区分各个集合,我们需要给这个集合起个名字,这些名字就是我们在企业管理器的方案下看到的许多类似用户名的节点,这些类似用户名的节点其实就是一个schema,sc ...

  7. Windows搭建Log4Net+FileBeat+ELK日志分析系统过程

    参考博客:http://udn.yyuap.com/thread-54591-1-1.html ; https://www.cnblogs.com/yanbinliu/p/6208626.html ; ...

  8. Android自动化 -- sendevent/getevent 用法

    getevent&sendevent 是android系统下的一个工具,可以 模拟 多种按键和触屏操作,产生的是raw event,raw event经过event hub处理产生最终的ges ...

  9. HUST1017-Exact Cover

    给出一个\(n\times m\)的01矩阵,每行最多有\(c\)个1,求一个精确覆盖,即选出一些行使得每列有有且仅有一个1.输出方案. 分析 被这个题坑到了啊!!第一次上HUSTOJ做题,不知道没有 ...

  10. 多线程在javaweb中的应用

    1.web应用中,要对某一个任务用多线程实现,最简单的代码格式是不是必须把要执行的代码放在run方法中? WEB服务器会帮你把每个访问请求开辟一个线程,你只要按照你所开发的框架,比如tomcat会让你 ...