1. 程式人生 > >Lu分解法的C語言實現

Lu分解法的C語言實現

將係數矩陣A轉變成等價兩個矩陣L和U的乘積
,其中L和U分別是單位下三角矩陣和上三角矩陣。當A的所有順序主子式都不為0時,矩陣A可以分解為A=LU(所有順序主子式不為0,矩陣不一定不可以進行LU分解)。其中L是下三角矩陣,U是上三角矩陣。

LU分解在本質上是高斯消元法的一種表達形式。實質上是將A通過初等行變換變成一個上三角矩陣,其變換矩陣就是一個單位下三角矩陣。這正是所謂的杜爾裡特演算法(Doolittle algorithm):從下至上地對矩陣A做初等行變換,將對角線左下方的元素變成零,然後再證明這些行變換的效果等同於左乘一系列單位下三角矩陣,這一系列單位下三角矩陣的乘積的逆就是L矩陣,它也是一個單位下三角矩陣。

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

構造矩陣A,b

                {1,2,3,4, }
    A=[         {1,4,2,-8,}
                {1,-1,4,1}   ]
                {1,3,5,2}

b = [14,-17,2,8]^T

程式碼實現:

#include <stdio.h>
#include <stdlib.h>
//LU分解法實現解線性方程組
//copyright @ Mryang

double sumU(double L[4][4] ,double U[4][4], int i, int
j ){ double sU = 0.0; for (int k = 1; k <= i-1 ; k++) { sU += L[i-1][k-1] * U[k-1][j-1]; } return sU; }//計算求和1 double sumL(double L[4][4] ,double U[4][4], int i, int j ){ double sL = 0.0; for (int k = 0; k <= j-1; k++) { sL += L[i-1][k-1] * U[k-1][j-1
]; } return sL; }//計算求和2 double sumY(double L[4][4] ,double y[4],int i){ double sY=0.0; for (int k = 1; k <= i - 1; k++) { sY += L[i-1][k-1] * y[k-1]; } return sY; }//計算求和3 double sumX(double U[4][4] ,double x[4],int i ,int m){ double sX = 0.0; for (int k = i+1; k <= m; k++) { sX += U[i-1][k-1] * x[k-1]; } return sX; }//計算求和4 int main(){ double a[4][4] = { {1,2,3,1,}, {1,4,1,-1,}, {1,-1,-2,3,}, {1,3,-1,2}};//將係數存入二維陣列 double L[4][4] = {0}; double U[4][4] = {0};//初始化部分 double b[4] = {8,8,12,19}; int n = 4;//n階 //輸出[Ab] printf("[A]:\n"); for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { printf("%f\t", a[i-1][j-1]); } printf("\n"); } //計算L,U for (int i = 1; i <= n; i++) { L[i-1][i-1] = 1;//對角線元素為1 for (int j = i; j <= n; j++) { //由於陣列下標從0開始 所以i-1,j-1 U[i-1][j-1] = a[i-1][j-1] - sumU(L,U,i,j); if(j+1 <= n) L[j][i-1] = (a[j][i-1] - sumL(L,U,j+1,i))/U[i-1][i-1];//i變j+1,j變i } } //輸出U printf("U:\n"); for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { printf("%f\t",U[i-1][j-1]); } printf("\n"); } //輸出L printf("L:\n"); for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { printf("%f\t",L[i-1][j-1]); } printf("\n"); } //由Ly=b 求y double y[4] = {0.0}; y[0] = b[0];//y(1) = b(1); for (int i = 2; i <= n; i++) { y[i-1] = b[i-1] - sumY(L,y,i); } //由 Ux=y 求x double x[4] = {0.0}; for (int i = n; i >= 1; i--) { x[i-1] =( y[i-1] - sumX(U,x,i,n))/ U[i-1][i-1]; } //輸出y printf("y:\n"); for (int i = 0; i < n; i++) { printf("%f\n",y[i]); } printf("\n"); //輸出x printf("x:\n"); for (int i = 0; i < n; i++) { printf("%f\n",x[i]); } printf("\n"); system("pause"); return 0; }

執行結果:

這裡寫圖片描述

所以
x1=1
x2= 2
x3=-1
x4 = 3

相關推薦

Lu解法C語言實現

將係數矩陣A轉變成等價兩個矩陣L和U的乘積 ,其中L和U分別是單位下三角矩陣和上三角矩陣。當A的所有順序主子式都不為0時,矩陣A可以分解為A=LU(所有順序主子式不為0,矩陣不一定不可以進行LU分解)。其中L是下三角矩陣,U是上三角矩陣。

C語言程式設計:用LU解法求解方程組

示例:用LU分解法求解下列方程組:#include<stdio.h> #define max 4 void main() { int i,j,k,sum,L[max][max]={0},U[max][max]={0}, A[max][max]={4,2,1,

在STM32上實現NTFS之4:GPT區表的C語言實現(1):主GPT表頭的實現

center mbr分區 sum 對齊 字節數 決定 容器 alt 水平 題外話:在荒廢了很久沒有更新之後……某日突然收到讀者的站內信!內容大體是詢問GPT分區表信息的讀取方式,筆者激動萬分之下,決定繼續解剖NTFS……其實GPT嚴格上不算是NTFS的內容, GPT和M

在STM32上實現NTFS之5:GPT區表的C語言實現(2)GPT實現以及統一方式讀取磁盤

tfs 下載 數據 特殊 dpt 屬性列表 handle 系統分區 成了   上一節實現了主GPT頭的信息提取,這一節繼續提取整個的GPT數據,並且將GPT分區表和MBR分區表兩種格式融合成一個模塊,使主調函數(也可以說是使用者)不需要關心磁盤的分區表類型:它太底層了,確實

C語言實現快速排序法(治法)

下一個 enter hang partition 等於 就是 tor log markdown title: 快速排序法(quick sort) tags: 分治法(divide and conquer method) grammar_cjkRuby: true ---

進化演算法 C語言實現

之前的一篇中貼出了自己研究生期間C實現的基本粒子群演算法,執行速度顯然要比其他的高階語言快,這也是各個程式語言之間的差別,現在對於曾經輝煌過的差分進化演算法進行C語言實現。變異策略採用DE/rand/1,這個是最常見的。有錯誤之處請之處。 /***************D

C語言實現三列顯示的萬年曆

筆者提示:初學C語言,瞭解for,if,函式,陣列初步就可寫下面的效果出來了! 執行環境:VC++6.0 效果 程式碼 //本程式旨在製作分三列顯示的萬年曆 #include<stdio.h> void printblank(int n)

索引查詢(索引查詢、塊查詢) C語言實現

1、基本概念 索引查詢又稱分級查詢。 索引儲存的基本思想是:首先把一個集合或線性表(他們對應為主表)按照一定的函式關係或條件劃分成若干個邏輯上的子表,為每個子表分別建立一個索引項,由所有 這些索引項構成主表的一個索引表,然後,可採用順序或連結的方式來儲存索引表和每個子表。

[演算法]簡單的揹包問題遞迴解法C語言實現

今天講點簡單的演算法,最簡單的揹包0演算法,使用了遞迴的方法,相信看完程式碼的朋友會發現這段程式碼很熟悉,不過CG提供這些程式碼的目的只是讓全部揹包演算法的完整提供地給大家,程式碼很簡單,相信高手一看就懂,這裡的揹包演算法只是考慮了物品的重量,沒有考慮物品的價值,是初學遞迴演算法的朋友必看的程式碼,高手的話全

迷宮問題的通用解法C語言資料結構實現

1.1問題描述 以一個m*n的長方陣表示迷宮,0和1分別表示迷宮中的通路和障礙。設計一個程式,對任意設定的迷宮,求出一條從入口到出口的通路,或得出沒有通路的結論。 1.2基本要求 輸入的形式和範圍: 非遞迴:行列為整型,座標為整型 遞迴:迷宮以整型二維

快速排序(而治之策略及C語言實現

提出的問題 分而治之的策略 重要的分而治之演算法 快速排序 問題 要在一個長為x,寬為y的長方形中畫出均勻且大小相等的正方形 那麼正方形的邊長為多少 (1)可以看出正方形的邊長需要是x和y的最大公約數 如何求最大公約數?

三色棋解法C語言實現

三色旗的問題最早由E.W.Dijkstra所提出,他所使用的用語為Dutch Nation Flag(Dijkstra為荷蘭人),而多數的作者則使用Three-Color Flag來稱之。假設有一條繩子,上面有紅、白、藍三種顏色的旗子,起初繩子上的旗子顏色並沒有順序,您希望將

二十四進制編碼串轉換為32位無符號整數(C語言實現

bool while open 參數錯誤 hint div 第一個字符 bsp opened typedef int BOOL; #define TRUE 1; #define FALSE 0; #define UINT_MAX 0xffffffff

遺傳算法的C語言實現(二)

print 比較 詳細 author 當前 cross max r+ 訪問 上一次我們使用遺傳算法求解了一個較為復雜的多元非線性函數的極值問題,也基本了解了遺傳算法的實現基本步驟。這一次,我再以經典的TSP問題為例,更加深入地說明遺傳算法中選擇、交叉、變異等核心步

C語言實現粒子群算法(PSO)二

計算 default img 第一個元素 1.4 best 實驗 atl 說過 上一回說了基本粒子群算法的實現,並且給出了C語言代碼。這一篇主要講解影響粒子群算法的一個重要參數---w。我們已經說過粒子群算法的核心的兩個公式為: Vid(k+1)=w*Vid(k)+c1*r

遺傳算法的C語言實現(一):以非線性函數求極值為例

選中 algorithm 利用 mail 進化 lock gcc 最大值 -s 以前搞數學建模的時候,研究過(其實也不算是研究,只是大概了解)一些人工智能算法,比如前面已經說過的粒子群算法(PSO),還有著名的遺傳算法(GA),模擬退火算法(SA),蟻群算法(A

C語言實現粒子群算法(PSO)一

mat 遺傳 基於 [1] 沒有 實驗 規模 直觀 解決 最近在溫習C語言,看的書是《C primer Plus》,忽然想起來以前在參加數學建模的時候,用過的一些智能算法,比如遺傳算法、粒子群算法、蟻群算法等等。當時是使用MATLAB來實現的,而且有些MATLAB自帶了工具

(續)順序表之單循環鏈表(C語言實現)

include 作者 指針 順序 gb2 mark oos case 循環 單循環鏈表和單鏈表的唯一差別在於單循環鏈表的最後一個節點的指針域指向第一個節點, 使得整個鏈表形成一個環. C實現代碼例如以下: #include<stdio.h>