使用C++实现克拉默法则(Cramer‘s law)
生活随笔
收集整理的這篇文章主要介紹了
使用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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java node websocket_
- 下一篇: c++使用libiconv