解线性方程组(一)——克拉默法则求解(C++)

克拉默法则

解线性方程组最基础的方法就是使用克拉默法则,需要注意的是,该方程组必须是线性方程组。
假设有方程组如下:
{ a 11 x 1 + a 12 x 2 + ⋯ + a 1 n x n = b 1 a 21 x 1 + a 22 x 2 + ⋯ + a 2 n x n = b 2 ⋯ ⋯ ⋯ a n 1 x 1 + a n 2 x 2 + ⋯ + a n n x n = b n \begin{cases} a_{11}x_1+a_{12}x_2+\cdots+a_{1n}x_n=b_1\\ a_{21}x_1+a_{22}x_2+\cdots+a_{2n}x_n=b_2\\ \cdots \qquad \qquad\cdots \qquad \qquad \cdots \\ a_{n1}x_1+a_{n2}x_2+\cdots+a_{nn}x_n=b_n\\ \end{cases} a11x1+a12x2++a1nxn=b1a21x1+a22x2++a2nxn=b2an1x1+an2x2++annxn=bn
将其转换为矩阵形式
A x ⃗ = b ⃗ A\vec{x}=\vec{b} Ax =b
[ a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋱ ⋮ a m 1 a m 2 ⋯ a m n ] [ x 1 x 2 ⋮ x n ] = [ b 1 b 2 ⋮ b n ] \begin{bmatrix} {a_{11}}&{a_{12}}&{\cdots}&{a_{1n}}\\ {a_{21}}&{a_{22}}&{\cdots}&{a_{2n}}\\ {\vdots}&{\vdots}&{\ddots}&{\vdots}\\ {a_{m1}}&{a_{m2}}&{\cdots}&{a_{mn}}\\ \end{bmatrix} \begin{bmatrix} {x_{1}}\\ {x_{2}}\\ {\vdots}\\ {x_{n}}\\ \end{bmatrix}= \begin{bmatrix} {b_{1}}\\ {b_{2}}\\ {\vdots}\\ {b_n} \end{bmatrix} a11a21am1a12a22am2a1na2namn x1x2xn = b1b2bn
根据克拉默法则有:
x i = ∣ A i ∣ ∣ A ∣ x_i=\frac{|A_i|}{|A|} xi=AAi
A i = [ a 11 ⋯ a 1 i − 1 b 1 a 1 i + 1 ⋯ a 1 n a 21 ⋯ a 2 i − 1 b 2 a 2 i + 1 ⋯ a 2 n ⋮ ⋮ ⋱ ⋮ a n 1 ⋯ a n i − 1 b n a n i + 1 ⋯ a n n ] A_i= \begin{bmatrix} {a_{11}}&{\cdots}&{a_{1i-1}}&{b1}&{a_{1i+1}}&{\cdots}&{a_{1n}}\\ {a_{21}}&{\cdots}&{a_{2i-1}}&{b2}&{a_{2i+1}}&{\cdots}&{a_{2n}}\\ {\vdots}&{\vdots}&{\ddots}&{\vdots}\\ {a_{n1}}&{\cdots}&{a_{ni-1}}&{bn}&{a_{ni+1}}&{\cdots}&{a_{nn}}\\ \end{bmatrix} Ai= a11a21an1a1i1a2i1ani1b1b2bna1i+1a2i+1ani+1a1na2nann

代码

实现方法可以参考行列式求值(C++)、插值(一)——多项式插值(C++)

//克拉默法则求解线性方程组
/*
5x1+2x2-2x3=1
x1+4x2+x3=2
x1-2x2+4x3=-1
*/
#include<iostream>
#include<cmath>
//使用代数余子式进行求解
double determinant_value(double **D,int n)
{if(n==1){return D[0][0];}else if(n==0){throw "error: determinant is empty";}char flag = 1;//符号位double D_value = 0.0;double **D_temp = new double*[n];for (int i = 0; i < n;i++){D_temp [i]= new double[n];for(int j=0;j<n;j++){D_temp[i][j]=D[i][j];}}// 转为上三角for (int i = 0; i < n; i++){if (D_temp[i][i] == 0){int j = i + 1;// 将主对角线上的值转为非0值for (; j < n; j++){if (D_temp[j][i] != 0){double temp;for (int k = 0; k < n; k++){temp = D_temp[i][k];D_temp[i][k] = D_temp[j][k];D_temp[j][k] = temp; // 交换两行}flag = -flag;break;}}if (j == n){return D_value;}}// 将主对角线下面的值转为0for (int j = i + 1; j < n; j++){double temp = D_temp[j][i] / D_temp[i][i];for (int k = i; k < n; k++){D_temp[j][k] -= temp * D_temp[i][k];}}}// 计算行列式的值D_value = 1.0;for (int i = 0; i < n; i++){D_value *= D_temp[i][i];}D_value*=flag;for (int i = 0; i < n;i++){delete[] D_temp[i];}delete [] D_temp;return D_value;
}
//克拉默法则求解线性方程组
void Kramer(double **A,double *b,double *x,int n)
{double **A_i=new double*[n];double A_value=determinant_value(A,n);if(A_value==0){std::cout<<"该方程组不是线性方程组"<<std::endl;exit(0);}for (int i = 0; i < n; i++){A_i[i] = new double[n];for (int j = 1; j < n; j++){A_i[i][j] = A[i][j];}}//下面是为了求D_i,每次只需要修改两列数据for (int i = 0; i < n;i++){if(i==0){for(int j = 0;j < n;j++){A_i[j][0]=b[j];}}else{for(int i2 = 0;i2 < n;i2++){A_i[i2][i-1]=A[i2][i-1];A_i[i2][i]=b[i2];}}// for(int i2 = 0;i2 < n;i2++)// {//     for (int j2 = 0;j2 < n;j2++)//     {//         std::cout<<A_i[i2][j2]<<" ";//     }//     std::cout<<std::endl;// }//求多项式系数x[i] = determinant_value(A_i, n) / A_value;}for (int i = 0; i < n; i++){delete[] A_i[i];}delete[] A_i;
}
int main()
{int n;//矩阵维度std::cout<<"请输入矩阵维度:";std::cin>>n;double *x=new double[n];double **A = new double *[n];std::cout<<"请输入矩阵A的元素:"<<std::endl;for(int i = 0;i < n;i++){A[i] = new double [n];for(int j = 0;j < n;j++){std::cin>>A[i][j];}}double *b = new double [n];std::cout<<"请输入矩阵b的元素:"<<std::endl;for(int i = 0;i < n;i++){std::cin>>b[i];}Kramer(A, b, x, n);for (int i = 0; i < n; i++){std::cout<<"x"<<i+1<<"="<<x[i]<<" ";}for (int i = 0; i < n; i++){delete[] A[i];}delete[] A;delete [] b;delete[] x;return 0;
}

结果分析

运行结果如下:
在这里插入图片描述

matlab结果如下:
在这里插入图片描述
此方法虽然可以求解,但是存在一个问题,就是当矩阵维度较大时,程序运行时间会很长,所以在一些精度要求不高的地方,不需要使用此方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/471532.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

14. 推荐系统之矩阵分解

本文为 「茶桁的 AI 秘籍 - BI 篇 第 14 篇」 文章目录 矩阵分解 ALS常用推荐算法什么是矩阵分解矩阵分解的目标函数 Hi&#xff0c;你好。我是茶桁。 新年过后&#xff0c;咱们要开始学一些新内容了。从今天开始&#xff0c;要给大家去讲解的是关于推荐系统的内容。推荐系统的…

设计链表(不难,代码稍微多一点)

设计链表 在链表类中实现这些功能&#xff1a; get(index)&#xff1a;获取链表中第 index 个节点的值。如果索引无效&#xff0c;则返回-1。addAtHead(val)&#xff1a;在链表的第一个元素之前添加一个值为 val 的节点。插入后&#xff0c;新节点将成为链表的第一个节点。ad…

【数据结构】并查集

并查集是简单的数据结构&#xff0c;学会并查集&#xff0c;为图打好基础。 并查集的概念 是树状的数据结构&#xff0c;用于处理相交集合的合并与查询 通常用森林表示&#xff0c;一片森林表示一个集合 并查集一般需要完成 查找元素属于哪个集合查看两个元素是否属于同一个集…

C++二叉树进阶——二叉搜索树

二叉搜索树 1. 二叉树的概念2. 二叉树的实现2.1创建节点类2.2 查找Find2.3 插入Insert2.4 删除Erase2.5 中序遍历2.6 构造/析构 3. 递归实现3.1 查找FindR3.2 插入InsertR3.3 删除EraseR 4.整体代码 1. 二叉树的概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&am…

springboot743二手交易平台

springboot743二手交易平台 获取源码——》公主号&#xff1a;计算机专业毕设大全

2024 年 11 款最佳 iPhone 数据恢复软件和应用程序

数据丢失是任何人都无法承受的&#xff0c;因为它对每个人都至关重要。但导致数据丢失的原因有很多&#xff0c;一些常见的原因是意外删除数据、设备被盗、iOS 越狱、硬件损坏、病毒感染等。我们列出了 iOS 的顶级恢复工具&#xff0c;其中包括&#xff1a;将帮助您方便地恢复数…

相机图像质量研究(20)常见问题总结:CMOS期间对成像的影响--全局快门/卷帘快门

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

【Java多线程】对进程与线程的理解

目录 1、进程/任务&#xff08;Process/Task&#xff09; 2、进程控制块抽象(PCB Process Control Block) 2.1、PCB重要属性 2.2、PCB中支持进程调度的一些属性 3、 内存分配 —— 内存管理&#xff08;Memory Manage&#xff09; 4、线程&#xff08;Thread&#xff09;…

Go语言的100个错误使用场景(40-47)|字符串函数方法

前言 大家好&#xff0c;这里是白泽。 《Go语言的100个错误以及如何避免》 是最近朋友推荐我阅读的书籍&#xff0c;我初步浏览之后&#xff0c;大为惊喜。就像这书中第一章的标题说到的&#xff1a;“Go: Simple to learn but hard to master”&#xff0c;整本书通过分析100…

如何在Windows中配置多个显示器?这里提供详细步骤

Windows可以通过多种方式使用多个显示器,扩展或复制主显示器。你甚至可以关闭主显示器。以下是如何使用简单的键盘快捷键更改辅助显示设置。 使用Windows+P投影菜单 要快速更改Windows 10处理多个显示器的方式,请按Windows+P。屏幕右侧会弹出一个名为“投影”的深灰色菜单。…

Base64编码的优点与缺点

title: Base64编码的优点与缺点 date: 2024/2/16 14:06:37 updated: 2024/2/16 14:06:37 tags: Base64编码ASCII转换数据传输文本存储安全性数据膨胀字符串解码 Base64编码是一种将二进制数据转换为可打印ASCII字符的编码方式。它被广泛应用于数据传输和存储&#xff0c;以提升…

- 工程实践 - 《QPS百万级的有状态服务实践》01 - 存储选型实践

本文属于专栏《构建工业级QPS百万级服务》 《QPS百万级的无状态服务实践》已经完成。截止目前为止&#xff0c;支持需求“给系统传入两个日期&#xff0c;计算间隔有多少天”的QPS百万级服务架构已经完成。如图1&#xff1a; 图1 可是这个架构不能满足需求“给系统传入两个日期…