使用C++实现克拉默法则(Cramer‘s law)
生活随笔
收集整理的這篇文章主要介紹了
使用C++实现克拉默法则(Cramer‘s law)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
本文最先發(fā)布于本人博客 嗶嗶嗶嗶-使用C++實現(xiàn)克拉默法則(Cramer’s law)
克拉默法則(Cramer’s law)是線性代數(shù)中的一條定理,用行列式來計算出線性等式組中的所有解,被用于計算n元一次方程
前言
近期線性代數(shù)學習到了克拉默法則,結(jié)合前文使用C++實現(xiàn)n階行列式的計算所寫代碼,可以實現(xiàn)解n元一階方程的目的
項目地址
https://github.com/gst-be/cramer
代碼
本次代碼分為主程序main.cpp和子程序det.cpp兩部分,主程序主要負責數(shù)值的輸入和輸出,子程序負責計算行列式
main.cpp
#include <iostream> #include "det.cpp"//導入det.cpp子程序文件 #define MAX 30//最大階數(shù)//生成臨時數(shù)組c,從a導入數(shù)值,并將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);//調(diào)用子程序的函數(shù)計算并返回結(jié)果 }int main() {double a[MAX][MAX];//定義每項前系數(shù)double b[MAX];//定義等號右邊的數(shù)int n;//定義階數(shù)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;//計算每項前系數(shù) int t(int p[N],int n) { int c=0;//定義逆序數(shù)計數(shù)器for(int i=0;i<n-1;i++){for(int j=i+1;j<n;j++){if(p[i]>p[j]) c++;//出現(xiàn)逆序則自增1else if(p[i]==p[j])return 0;//出現(xiàn)同列情況將系數(shù)變?yōu)?}}if(c%2==0)return 1;//偶逆序數(shù)返回1elsereturn -1;//奇逆序數(shù)返回-1 }//計算系數(shù)外每項的乘積 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;//返回本次序列數(shù)所對應的乘積 }double det(double x[max_n][max_n],int n) {double sum=0;//初始化結(jié)果為0int p[N];//定義序列數(shù),從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);//開始生成序列數(shù)p[0]++;for(int j=0;j<n;j++){if(p[j]==n){p[j]=0;p[j+1]++;}}}return sum; }解析
行列式的計算
有關(guān)行列式相關(guān)代碼,此處不作解析,詳見前文使用C++實現(xiàn)n階行列式的計算
克拉默法則
xi=DiDx_i=\frac{D_i}{D}xi?=DDi??
系數(shù)行列式D的值由數(shù)組a[MAX][MAX]存儲,等號右邊數(shù)值由數(shù)組b[MAX]存儲
下標i由for循環(huán)遍歷,i的值會被傳遞給子函數(shù)calc()
在子函數(shù)calc()中,會復制a[][]的值給臨時數(shù)組c[][]
但在第i列會賦b[i]的值以替換
本文已發(fā)表于嗶嗶嗶嗶(bebebe.be)
總結(jié)
以上是生活随笔為你收集整理的使用C++实现克拉默法则(Cramer‘s law)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java node websocket_
- 下一篇: DOSBox 的安装及使用 详细教程