程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> Guass列主元、平方根法、追趕法求解方程組的C++實現

Guass列主元、平方根法、追趕法求解方程組的C++實現

編輯:關於C++

一,要解決的問題

選用合適的算法,求解三種線性方程組:一般線性方程組,對稱正定方程組,三對角線性方程組。
方程略。


二,數值方法

1,使用Guass列主元消去法求解一般線性方程組。

Guass列主元是為了防止Guass消去法中大數吃掉小數而引出的一種線性方程組求解方法,消元時選用一列中絕對值最大的元素作為列主元素。
算法偽代碼:

消元過程

這裡寫圖片描述

回代過程

這裡寫圖片描述

2,使用平方根法求解對稱正定方程組

平方根法,它把系數矩陣(對稱正定矩陣)表示成一個下三角矩陣L和其轉置的乘積的分解。這種分解又稱為Cholesky分解。
這裡寫圖片描述

3,使用追趕法求解三對角線性方程組

三對角線性方程組是指這一類的線性方程組:系數矩陣是一個對角占優的三對角矩陣。追趕法是專門用來求解三對角線性方程組的,它將系數矩陣分解成alpha矩陣和beta矩陣的乘積,如下圖所示:
這裡寫圖片描述


三,算法

1,Guass列主元消去法

/*
CreateOn:2016/03/20
Author:linxiaobai
Function:linear equation solution
solution1:列主元Guass消去法求解一般線性方程組
*/
#include "stdafx.h"
# include
# include
# include
# include
# include
using namespace std;
double a[15][15];
const int N=10;
double res[N+1];
void printArry(double a[][15])//打印增廣矩陣
{
    for(int i=1;i<=10;i++)
    {
        for(int j=1;j<=11;j++)
        {
            cout<

2,使用平方根算法解對稱正定方程組

/*
CreateOn:2016/03/20
Author:linxiaobai
Function:linear equation solution
solution1:使用平方根算法解對稱正定方程組
*/
# include"stdafx.h"
# include
# include
# include
# include
using namespace std;
double a[10][10];
const int N=8;
double b[N+1],xx[N+1],yy[N+1];
void printArry(double a[][10])//輸出系數矩陣
{
    for(int i=1;i<=8;i++)
    {
        for(int j=1;j<=8;j++)
        {
            cout<=1;k--)
    {
        double s4=0;
        for(int m=k+1;m<=N;m++)
            s4+=a[m][k]*xx[m];
        xx[k]=(yy[k]-s4)/a[k][k];
    }
    cout<
3,使用追趕法解三對角線性方程組
/*
CreateOn:2016/03/20
Author:linxiaobai
Function:linear equation solution
solution1:使用追趕法解三對角線性方程組
*/
# include"stdafx.h"
# include
# include
# include
# include
using namespace std;
const int N=10;
double a[N+1],c[N+1],d[N+1],xx[N+1],yy[N+1];
int main()
{
    cout<<"【運用追趕法解三對角線性方程組】"<

四,數值結果

1,Guass列主元消去法

這裡寫圖片描述

2,使用平方根算法解對稱正定方程組

這裡寫圖片描述

3,使用追趕法解三對角線性方程組

這裡寫圖片描述



五,結果分析與實驗總結

浮點計算產生的誤差

在Guass消元算法之前的代碼中,我使用了近似的方法,將絕對值小於10的-14次方的值近似為0,現在去掉這個處理,來看一下結果:

for(int i=1;i<=N;i++)
        //if(abs(res[i])<10e-14)
            //cout<<"0"<<" ";
        //else
            cout<

這裡寫圖片描述

可以看到x3的值是一個十分接近於0的數,如果將消元後的系數矩陣打印出來,可以看到消元後的系數矩陣並不是一個真正的上三角矩陣,下三角部分有幾處的值是一個絕對值極小的值,這是由於計算機的浮點計算造成的,浮點數在計算機中本身就不是一個精確的數,在消元的過程中,一些浮點運算有誤差,於是最後得到的是近似值,而不是0。
同理,平方根法和追趕法也會產生由浮點數計算引起的誤差,減少計算誤差正是學習數值分析的目的。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved