当前位置: 首页 > news >正文

数值实验-高斯消元LU分解

实验课的作业,用LU分解矩阵A求解线性方程组。

注:只是课程的设计,不可以当作ACM的模板,也是不是考虑的很周到,只是提供一个思路。

#include "cstdio"
#include "cstring"
#include "cstdlib"
#include "cmath"
using namespace std;

const double eps = 1e-8;
const int maxr = 100;
const int maxc = 100;

struct Matrix {
    double m[maxr][maxc];
    int row, col;
};

Matrix operator - (Matrix a, Matrix b) {
    Matrix c;
    c.col = a.col; c.row = a.row;
    for (int i = 0; i < a.row; i++) {
        for (int j = 0; j < a.col; j++) {
            c.m[i][j] = a.m[i][j]-b.m[i][j];
        }
    }
    return c;
}

Matrix operator + (Matrix a, Matrix b) {
    Matrix c;
    c.col = a.col; c.row = a.row;
    for (int i = 0; i < a.row; i++) {
        for (int j = 0; j < a.col; j++) {
            c.m[i][j] = a.m[i][j] + b.m[i][j];
        }
    }
    return c;
}

Matrix operator * (Matrix a, Matrix b) {
    Matrix c;
    memset(c.m, 0, sizeof(c.m));
    c.row = a.row; c.col = b.col;
    for (int i = 0; i < a.row; i++) {
        for (int k = 0; k < a.col; k++) {
            for (int j = 0; j < b.col; j++) {
                c.m[i][j] += a.m[i][k]*b.m[k][j];
            }
        }
    }
    return c;
}

Matrix pre_solve(Matrix a, Matrix b) {
    Matrix c;
    c.row = b.row; c.col = 1;
    for (int i = 0; i < a.row; i++) {
        double t = b.m[i][0];
        for (int j = 0; j < i; j++) {
            t -= a.m[i][j]*c.m[j][0];
        }
        c.m[i][0] = t/a.m[i][i];
    }
    return c;
}
//后代法
Matrix pos_solve(Matrix a, Matrix b) {
    Matrix c;
    c.row = b.row; c.col = 1;
    for (int i = a.row-1; i >= 0; i--) {
        double t = b.m[i][0];
        for (int j = i+1; j < a.col; j++) {
            t -= a.m[i][j]*c.m[j][0];
        }
        c.m[i][0] = t/a.m[i][i];
    }
    return c;
}
//生成初等行变换矩阵
Matrix init_Matrix(int p, int q, int n) {
    Matrix c;
    c.col = c.row = n;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (i == j) c.m[i][j] = 1.0;
            else c.m[i][j] = 0.0;
        }
    }
    if (p == q) return c;
    c.m[p][p] = 0.0;
    c.m[p][q] = 1.0;
    c.m[q][q] = 0.0;
    c.m[q][p] = 1.0;
    return c;
}

void show_Matrix(Matrix a) {
    for (int i = 0; i < a.row; i++) {
        printf("%.8f", a.m[i][0]);
        for (int j = 1; j < a.col; j++) {
            printf(" %.8f", a.m[i][j]);
        }
        printf("\n");
    }
}
//高斯消元
Matrix Gauss(Matrix a, Matrix b) {
    Matrix c, L, U = a;
    for (int i = 0; i < a.col-1; i++) {
        for (int j = i+1; j < a.row; j++) {
            U.m[j][i] = U.m[j][i]/U.m[i][i];
        }
        for (int j = i+1; j < a.row; j++) {
            for (int k = i+1; k < a.col; k++) {
                U.m[j][k] -= U.m[i][k]*U.m[j][i];
            }
        }
    }
    L.col = U.col;L.row = U.row;
    for (int i = 0; i < U.row; i++) {
        for (int j = 0; j < U.col; j++) {
            if (i == j) L.m[i][j] = 1.0;
            else if (i > j) L.m[i][j] = U.m[i][j], U.m[i][j] = 0.0;
            else L.m[i][j] = 0.0;
        }
    }
    c = pre_solve(L, b);
    return pos_solve(U, c);
}
//高斯列主元
Matrix ad_Gauss(Matrix a, Matrix b) {
    Matrix c, L, U = a, P = init_Matrix(0, 0, a.row);
    L.col = U.col; L.row = U.row;
    memset(L.m, 0, sizeof(L.m));
    for (int i = 0; i < a.col-1; i++) {
        int K = i;
        double maxx = 0.00;
        for (int j = i; j < a.row; j++) {
            if (fabs(U.m[i][j]) - maxx > eps) {
                maxx = fabs(U.m[i][j]), K = j;
            }
        }
        P = init_Matrix(i, K, a.row)*P;
        U = init_Matrix(i, K, a.row)*U;
        for (int j = i+1; j < U.row; j++) {
            U.m[j][i] = U.m[j][i]/U.m[i][i];
        }
        for (int j = i+1; j < U.row; j++) {
            for (int k = i+1; k < U.col; k++) {
                U.m[j][k] -= U.m[i][k]*U.m[j][i];
            }
        }
    }
    L.col = U.col;L.row = U.row;
    for (int i = 0; i < U.row; i++) {
        for (int j = 0; j < U.col; j++) {
            if (i == j) L.m[i][j] = 1.0;
            else if (i > j) L.m[i][j] = U.m[i][j], U.m[i][j] = 0.0;
            else L.m[i][j] = 0.0;
        }
    }
    c = pre_solve(L, P*b);
    return pos_solve(U, c);
}

int main(int argc, char const *argv[])
{
    Matrix A, B, C;
    int n;
    printf("输入系数矩阵的维数\n");
    scanf("%d", &n);
    A.col = A.row = n;
    B.row = n; B.col = 1;
    printf("输入矩阵A\n");
    for (int i = 0; i < A.row; i++) {
        for (int j = 0; j < A.col; j++) scanf("%lf", &A.m[i][j]);
    }
    printf("输入矩阵B\n");
    for (int i = 0; i < B.row; i++) scanf("%lf", &B.m[i][0]);
    C = ad_Gauss(A, B);
    printf("利用高斯消元得到的解为\n");
    show_Matrix(C);
    return 0;
}

转载于:https://www.cnblogs.com/cniwoq/p/8886656.html

相关文章:

  • JSONP的跨域原理
  • Spring Boot 部署与服务配置
  • FormData的使用及input文件上传
  • 工业强基 - 头条新闻
  • CPU和内存 程序(线程)关系
  • 双循环递归匹配路由表
  • editplus 注册码
  • 在窗体中把DataGridView中的数据导出Excel
  • Linux学习笔记4月19日任务
  • 《Linux学习并不难》用户管理(1):Linux用户账户分类
  • Java-JUC(八):使用wait,notify|notifyAll完成生产者消费者通信,虚假唤醒(Spurious Wakeups)问题出现场景,及问题解决方案。...
  • 最简单的curl扒网页
  • 如何在微信小程序中使用async/await
  • 实践详细篇-Windows下使用VS2015编译安装Caffe环境(CPU ONLY)
  • 阿里云副总裁:自主可控的云比拿来主义能走更远
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 【刷算法】求1+2+3+...+n
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • exports和module.exports
  • hadoop集群管理系统搭建规划说明
  • Idea+maven+scala构建包并在spark on yarn 运行
  • JavaScript函数式编程(一)
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • js算法-归并排序(merge_sort)
  • Linux CTF 逆向入门
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • nodejs调试方法
  • swift基础之_对象 实例方法 对象方法。
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • Unix命令
  • VUE es6技巧写法(持续更新中~~~)
  • windows下mongoDB的环境配置
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 容器服务kubernetes弹性伸缩高级用法
  • 收藏好这篇,别再只说“数据劫持”了
  • 跳前端坑前,先看看这个!!
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 赢得Docker挑战最佳实践
  • 优化 Vue 项目编译文件大小
  • 在weex里面使用chart图表
  • zabbix3.2监控linux磁盘IO
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • #pragma multi_compile #pragma shader_feature
  • ( 10 )MySQL中的外键
  • (12)Linux 常见的三种进程状态
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (十六)串口UART
  • (一) storm的集群安装与配置
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET 依赖注入和配置系统
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .net连接MySQL的方法