數值分析 三角矩陣排序向量及求解過程

2021-10-10 06:59:56 字數 3806 閱讀 3088

對於乙個三角矩陣,如何得到排序向量 p

pp ?給出演算法並用程式實現它;

請實現三角系統的向前帶入演算法,給出程式並通過算例驗證;

請給出三角系統的向後帶入演算法,給出程式並通過算例驗證;

由於給出矩陣預設為三角矩陣,因此通過排序後只有上三角或下三角兩種可能。因此我們先以下三角矩陣為例進行分析,然後再考慮如何判斷三角矩陣的型別;

對於乙個可化為下三角矩陣的三角矩陣an×

na_

an×n

​,其第 i

ii 列向量至少有 (n−

i+1)

(n-i+1)

(n−i+1

) 個 0

00 元。而當我們從後向前遍歷時,第 i

ii 列出現的非零元所在行向量即為排序後第 i

ii 行(需排除從 i+1

i+1i+

1 到 n

nn 已找出的行向量),上三角矩陣反之;

通過2所述方法我們可以找到排序向量,但倘若採用暴力遍歷的方式,其複雜度為 o(n

2)

o(n^2)

o(n2

) 對於大矩陣來說是不太理想的,考慮採用佇列的方式優化,即用 (1→

n)

(1\to n)

(1→n

) 到初始化佇列,然後按佇列裡資料 i

ii 從矩陣最後一列開始遍歷,第 i

ii 行數值非零即彈出否則再入隊尾;

由於不清楚三角陣的型別,我們可以先假設其為下三角陣,如果該矩陣本為上三角陣或存在主元為0,則迭代過程中就會出現:在排除從 i+1

i+1i+

1 到 n

nn 已找出的行向量後剩餘行向量在第 i

ii 列的值均為0的情況,即找不出非零元。那麼可以假設其為上三角陣再計算一遍。若仍存在找不到非零元情況,則可以判斷存在0主元排序向量不唯一且向前或向後帶入法不可解;

最後考慮到在c++中輸入矩陣視覺化較差且出錯不易修改,考慮在txt檔案中輸入矩陣,然後通過演算法讀入並儲存。

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

bool

under_tag

(vectorint>>

& matrix, vector<

int>

& p,

int n)

int l = n -1;

//從最後一列開始遍歷

int rept =0;

//迭代步

while

(!init.

empty()

&& rept < n)

else}if

(rept < n)

else

}bool

up_tag

(vectorint>>

& matrix, vector<

int>

& p,

int n)

int l =0;

//從第一列開始遍歷

int rept =0;

//迭代步

while

(!init.

empty()

&& rept < n)

else}if

(rept < n)

else

}void

function1

(vector<

double

>

& ans, vectorint>>

& matrix, vector<

int>

& p,

int n)

else

ans[i]=(

(double

)matrix[p[i]

][n]

- temp)

/ matrix[p[i]

][i];}

}}void

function2

(vector<

double

>

& ans, vectorint>>

& matrix, vector<

int>

& p,

int n)

else

ans[i]=(

(double

)matrix[p[i]

][n]

- temp)

/ matrix[p[i]

][i];}

}}intmain()

string line;

vector arr;

while

(getline

(read_file, line)

) n = arr.

size()

;//獲得矩陣的行數,即維度

vectorint>>

matrix

(n, vector<

int>

(n +1,

0));

//用二維vector儲存增廣矩陣

for(

int i =

0; i < n; i++

)else}}

cout <<

"輸入矩陣為:"

<< endl;

//將讀入矩陣輸出

for(

int i =

0; i < n; i++

) cout << endl;

} cout << endl;

vector<

int> p;

//定義排序向量

while

(!p.

empty()

) p.

pop_back()

;//初始化

vector<

double

> ans;

//儲存解並初始化

for(

int i =

0; i < n; i++

) ans.

push_back(0

);if(

under_tag

(matrix, p, n)

==true

) cout << endl << endl;

cout <<

"採用向前帶入演算法"

<< endl << endl;

//採用向前帶入演算法

function1

(ans, matrix, p, n);}

elseif(

up_tag

(matrix, p, n)

==true

) cout << endl << endl;

cout <<

"採用向後帶入演算法"

<< endl << endl;

//採用向後帶入演算法

function2

(ans, matrix, p, n);}

else

cout <<

"方程的解x1到x"

<< n <<

"為:"

;//輸出解

for(

int i =

0; i < n; i++

) cout << endl;

return0;

}

最近好忙啊,沒時間再作修改了,就按照上機報告的樣子拷貝過來了。有什麼錯誤或考慮不周全的忘各位看官們指出。另外要是有人能教教我typora**塊匯出錯位如何解決就好了,哈哈哈,不過我這小部落格應該沒幾個人看吧~

上三角矩陣下三角矩陣

要求給定矩陣,輸出其上三角矩陣或下三角矩陣 源 如下 include include include include const int m 5 void proc int array m m void main printf n proc a printf result array is n fo...

帶狀矩陣,對稱矩陣,三角矩陣

對稱矩陣 include 重要公式 p k k 1 2 p1 sizeof int p p1 p1 1 2 k sizeof int include int main printf 請輸入要詢問的數 n printf d n p for i 1 i m i else 在對角線以上可以通過對角線以下查...

判斷上三角矩陣

第5題 描述 輸入乙個正整數n 2 n 10 和n n矩陣a中的元素,如果a是上三角矩陣,輸出 yes 否則輸出 no 輸入 第一行為正整數n,表示矩陣大小。接著n行,每一行n個整數,整數以空格間隔。輸出 輸出 yes 或 no 輸入示例 33 4 5 1 2 3 1 3 4 輸出示例 no 提示 ...