使用C++实现克拉默法则(Cramer‘s law)
本文最先发布于本人博客 哔哔哔哔-使用C++实现克拉默法则(Cramer’s law)
克拉默法则(Cramer’s law)是线性代数中的一条定理,用行列式来计算出线性等式组中的所有解,被用于计算n元一次方程
前言
近期线性代数学习到了克拉默法则,结合前文使用C++实现n阶行列式的计算所写代码,可以实现解n元一阶方程的目的
项目地址
https://github.com/gst-be/cramer
代码
本次代码分为主程序main.cpp
和子程序det.cpp
两部分,主程序主要负责数值的输入和输出,子程序负责计算行列式
main.cpp
#include <iostream>
#include "det.cpp"//导入det.cpp子程序文件
#define MAX 30//最大阶数//生成临时数组c,从a导入数值,并将c[][t]赋b的值
double calc(double a[MAX][MAX],double b[MAX],int n,int t)
{double c[MAX][MAX];for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(j==t)c[i][j]=b[i];elsec[i][j]=a[i][j];}}return det(c,n);//调用子程序的函数计算并返回结果
}int main() {double a[MAX][MAX];//定义每项前系数double b[MAX];//定义等号右边的数int n;//定义阶数cout<<"Input n=";cin>>n;for(int i=0;i<n;i++){for(int j=0;j<n;j++){cout<<"a["<<i<<"]["<<j<<"]=";cin>>a[i][j];}cout<<"b["<<i<<"]=";cin>>b[i];}for(int t=0;t<n;t++){cout<<"x["<<t<<"]="<<calc(a,b,n,t)/det(a,n)<<endl;//即x=Di/D}return 0;
}
det.cpp
#include <iostream>
#include <cmath>
#define N 900//比n^n大即可
#define max_n 30//最高可算多少阶行列式using namespace std;//计算每项前系数
int t(int p[N],int n)
{ int c=0;//定义逆序数计数器for(int i=0;i<n-1;i++){for(int j=i+1;j<n;j++){if(p[i]>p[j]) c++;//出现逆序则自增1else if(p[i]==p[j])return 0;//出现同列情况将系数变为0}}if(c%2==0)return 1;//偶逆序数返回1elsereturn -1;//奇逆序数返回-1
}//计算系数外每项的乘积
double product(double x[max_n][max_n],int p[N],int n)
{double pdt=1;//乘积初始化为1for(int i=0;i<n;i++){pdt*=x[i][p[i]];}return pdt;//返回本次序列数所对应的乘积
}double det(double x[max_n][max_n],int n)
{double sum=0;//初始化结果为0int p[N];//定义序列数,从p[1]开始每一位的值对应取x[][]中每行的第几列for(int i=0;i<N;i++){p[i]=0;//初始化}for(int i=0;i<pow(n,n);i++){sum+=t(p,n)*product(x,p,n);//开始生成序列数p[0]++;for(int j=0;j<n;j++){if(p[j]==n){p[j]=0;p[j+1]++;}}}return sum;
}
解析
行列式的计算
有关行列式相关代码,此处不作解析,详见前文使用C++实现n阶行列式的计算
克拉默法则
xi=DiDx_i=\frac{D_i}{D}xi=DDi
系数行列式D的值由数组a[MAX][MAX]
存储,等号右边数值由数组b[MAX]
存储
下标i
由for
循环遍历,i
的值会被传递给子函数calc()
在子函数calc()
中,会复制a[][]
的值给临时数组c[][]
但在第i
列会赋b[i]
的值以替换
本文已发表于哔哔哔哔(bebebe.be)
使用C++实现克拉默法则(Cramer‘s law)相关推荐
- matlab 矩阵维度受限,matlab中变量问题——readonly 索引超出矩阵维度 workspacefunc 215...
matlab程序运行过程中会出现如上提示,在网上检索未果,键入dbstop if error语句也无法定错误之处,就想这个错误不是一般的错误. 通过间隔打断点的方式最后定位错误为一句exist = f ...
- Chapter 3 (Determinants): Cramer‘s rule, volume, and linear transformations (克拉默法则、体积和线性变换)
本文为<Linear algebra and its applications>的读书笔记 目录 Cramer's Rule Application to Engineering A Fo ...
- 线性代数学习笔记——克拉默法则及矩阵的秩——1. 克拉默法则
1. 克拉默法则(Cramer) 2. 克拉默法则应用示例1 3. 克拉默法则应用示例2(待定系数法) 4. 克拉默法则的理论意义大于实际意义
- Power Law and Exponential Decay of Inter Contac...
2019独角兽企业重金招聘Python工程师标准>>> MobiCom'07, September 9–14, 2007: the observed dichotomy: Power ...
- R语言distCosine函数计算大圆距离实战(Law of Cosines Great Circle Distance)
R语言distCosine函数计算大圆距离实战(Law of Cosines Great Circle Distance) 目录 R语言distCosine函数计算大圆距离实战(Law of Cosi ...
- 的g极串一个电阻_Ohm#39;s Law 简单系列D:从惠斯通(会石头)测电阻开始说
引子 伏安法测电阻是初中电学中考典型实验之一,也是历年中考.一二模重点考查的内容,但电阻的测量方法不局限于伏安法,具有一定的灵活性.技巧性.多样性.按照基本器材来分有:伏安法.伏阻法.安阻法等.按照设 ...
- 台湾国立大学郭彦甫Matlab教程笔记(22) Cramer's method(Inverse matrix逆矩阵法)
台湾国立大学郭彦甫Matlab教程笔记(22) Cramer's method(Inverse matrix) matrix left division左除:\ or mldivide() solvi ...
- tableau必知必会之运用本福德定律(Benford‘s law)验证数据真实性
本福德定律 本福德定律(本福德法则 Benford's law ),也称为本福德法则,说明一堆从实际生活得出的数据中,以1为首位数字的数的出现机率约为总数的三成,接近期望值 1/9 的 3 倍.而越大 ...
- 线性代数:第一章 行列式(2)行列式按行(列)展开 克拉默法则
第三节 行列式按行(列)展开 一.数学概念 余子式和代数余子式 在n阶行列式中,把元素 所在第i行和第j列划去后,留下来的n-1阶行列式叫做元素 的余子式,记作 ,记 , 叫做元素 的代数 ...
- 迪米特法则(Law of Demeter) 简介
在Java里class设计经常会提到一些个原则或者规则 最出名的莫非是 封闭-开放原则了(closed-open principle) 而这次这个 Law of Demeter 也是挺重要的. 一, ...
最新文章
- 浅谈MySQL架构体系
- Hive _练习,更新中
- One order text browser tool
- 程序员看了表示很开心
- 启动php-fpm服务器_无服务器冷启动不是问题-这就是为什么(对于大多数应用程序)...
- [hdu5372 Segment Game]树状数组
- 爬早-精典小结-0226
- mysql报错代码10051_zabbix_server 不能监听端口tcp 10051(示例代码)
- MFC创建MDI程序一个Doc对应多个View
- 24.事务控制和锁定语句
- 推荐系统实践--基于用户的协同过滤算法
- 工作流引擎之-activiti6使用
- CV520直接pin对pin替换 MS520,直接替换,无需修改硬件以及软件
- 实现B站弹幕很难么?这个开源项目了解一下
- 王文京:纵横30年,阵阵桂花香
- docker 仓库镜像 替换_Docker如何制作自己镜像并上传dockerhub
- AWS 吹走了私有云天空中最后一片乌云
- 字节跳动 文林福_AI实力赋能,让汽车营销玩出抖音范
- matlab平稳性检验
- 网络爬虫——爬取京东数据