山東大學數值計算實驗二(matlab)

2021-08-15 12:20:13 字數 3134 閱讀 1360

**:

數值計算實驗二**以及實驗報告位址

實驗題目:

1、高斯消元法 computer problems p100 2.2,(a)(b)

(1)用matlab語言提供的方法解方程組(x=a\b)

(2)寫出直接lu分解函式(參考例2.13),給出a的直接lu分解結果

(3)寫前代、回代函式。結合lu分解,前代、回代解(a)(b)方程組。

(4)直接使用軟體環境提供的函式lu分解函式、解方程組方法比較

說明:(2)、(3),這幾部分不得直接使用軟體環境提供的函式完成,可以參考課本上的演算法流程實現

實驗**:

%實驗二第一問 解方程組(x=a\b)

a = [2,4,-2;4,9,-3;-2,-1,7];

b = [2;8;10];

c = [4;8;-6];

x = a\b;

y = a\c;

fprintf('結果為:');

xy

mylu函式:

function [ l,u,p ] = mylu( a )

%untitled2

此處顯示有關此函式的摘要

% 此處顯示詳細說明

% lu 三角分解

%[l,u,p] = mylu(a)

%生成單位下三角矩陣l,上三角矩陣u,以及排列向量p

%滿足:l*u = a(p,:)

%本函式可以解決主元位置上有0的情況

%獲得a的行數和列數

[n,n] = size(a);

%定義排列向量p

p = (1:n)';

%for

迴圈,用 k 記錄消元步數

for k = 1:n-1

%為了排除第k列全為0以及主元位置為0

%先找出第k列的對角元及以下元素的絕對值的最大值

[r,m] = max(abs(a(k:n,k))); % r為最大值,m 為相對行數

m = m+k-1; %此時 m 為最大值在a中對應的 行數

%如果第k列全為0 ,則跳過消元過程

if (a([m,k]) ~= 0)

%避免主元為0,將絕對值最大值交換到主元所在行,現在的主元是對角元

if( m ~= k)

a([k m],:) = a([m k],:); %矩陣a兩行進行交換

p([k m]) = p([m k]) ; %排列向量p 兩行進行交換

end%計算第k列元素除以主元後得到的數

i = k+1:n;

a(i,k) = a(i,k)/a(k,k);

%更新矩陣剩餘部分

j = k+1:n;

a(i,j) = a(i,j) - a(i,k)*a(k,j);

endend%分離結果

l = tril(a,-1) + eye(n,n); %tril()函式提取矩陣的下三角部分,eye()獲得單位矩陣

u = triu(a); %tril()函式提取矩陣的上三角部分

end

利用mylu函式**如下:

%實驗二的(2)寫出直接lu分解函式,給出a的直接lu分解結果

a = [2,4,-2;4,9,-3;-2,-1,7];

[l,u,p] = my_lu(a);

fprintf('矩陣a的 l*u 分解為:');lu

fprintf(' l*u 形成矩陣 lu 為:');

lu = l*u

fprintf(' 排列向量 p 為:');

p'fprintf('矩陣 a 為:');

a

(3)兩個函式,前代函式以及後代函式:

function

x = myforward

(l,x)

%my_forward 前向消元,前代

%對於下三角矩陣l, x = my_forward(l,b)給出 l*x = b 的解x

[n,n] = size(l);

%消元過程

for k = 1:n

j = 1:k-1 ;

x(k)= x(k) - l(k,j)*x(j);

x(k)= x(k)/l(k,k);

endend

function

x = myback

(u,x)

% my_back 後向消元

%對於上三角矩陣u, x = my_back(u,y) 給出 u*x = y 的解x

[n,n] = size(u);

%消元過程

for k = n:-1:1

j = k+1:n ;

x(k) = (x(k) - u(k,j)*x(j))/u(k,k);

endend

使用自編函式求解**:

%第三問 寫前代、回代函式。結合lu分解,前代、回代解(a)(b)方程組。

a = [2,4,-2;4,9,-3;-2,-1,7];

b = [2;8;10];

c = [4;8;-6];

[l,u,p] = mylu(a);

%重新排列 b ,向前消元,l*u*x1 = b,其中 l*y1 = b

y1 = myforward(l,b(p));

%反向回代

x1 = myback(u,y1);

fprintf('利用前代、回代函式,結合lu分解,得到的答案 x 為:')

x = x1

%重新排列 c ,向前消元,l*u*x2 = c,其中 l*y2 = c

y2 = myforward(l,c(p));

%反向回代

x2 = myback(u,y2);

fprintf('利用前代、回代函式,結合lu分解,得到的答案 y 為:')

y = x2

%實驗二的第四問 直接使用軟體環境提供的函式lu分解函式

[l,u,p] = lu(a);

fprintf('得到的 l*u 分解為:');

lu

山東大學作業系統實驗四

一.實驗內容 抽菸者問題。假設乙個系統中有三個抽菸者程序,每個抽菸者不斷地捲菸並抽菸。抽菸者捲起並抽掉一顆煙需要有三種材料 菸草 紙和膠水。乙個抽菸者有菸草,乙個有紙,另乙個有膠水。系統中還有兩個 者程序,它們無限地 所有三種材料,但每次僅輪流提供三種材料中的兩種。得到缺失的兩種材料的抽菸者在捲起並...

山東大學程式設計第二週作業

東東有一張地圖,想通過地圖找到妹紙。地圖顯示,0表示可以走,1表示不可以走,左上角是入口,右下角是妹紙,這兩個位置保證為0。既然已經知道了地圖,那麼東東找到妹紙就不難了,請你編乙個程式,寫出東東找到妹紙的最短路線。輸入是乙個5 5的二維陣列,僅由0 1兩數字組成,表示法陣地圖。輸出若干行,表示從左上...

山東大學Python(3) 容器

使用 jupyter notebook 編寫 本章知識目錄 本節非常簡單,看ppt即可,下面的 為一些測試 考試 非常重要 查詢 增加 刪除 引用 ppt所有的都要看 list list name.remove x 刪除首次出現的值為x的元素,x不存在則丟擲異常 del list name inde...