数値計算法-線形方程式を解く

要件:
①AX= bを解く関数を記述します。つまり、入力はA、bですが、Aは上三角行列または下三角行列にしかなれません。
②関数を記述し、AX = bを解き、ガウスの消去法(ピボットの選択とピボットの選択なしを含む)を使用し、①関数を呼び出してXを解きます。
③行列Aのdoolittle分解を実行する関数を記述し、単位下三角行列Lと上三角行列Uを出力します。主要素を選択すると、置換行列Pが同時に出力されます。
④正定行列Aでコレスキー分解を行い、下三角行列Lを出力する関数を記述します。
理論:
①線形方程式を解く一般的な解法は、直接解法と反復法の2つです。
②直接法は、有限ステップと4つの算術演算で方程式を正確に解く方法です。ただし、実際の計算では丸め誤差が発生するため、この方法では近似解しか得られません。
③反復的な方法は、最初に解の初期近似値を与え、次に特定の規則に従ってより正確な解を見つけること、つまり、特定の限界プロセスで正確な解に徐々に近づく方法です。
matlabコード:
1。AX = bを解きます(Aは上の三角形です)

function x=slo(A,b)
    n = length(b);
    x = zeros(n,1);
    x(n) = b(n)/A(n,n);
if istriu(A)
    for i = n-1:-1:1
        x(i) = (b(i)-A(i,i+1:n)*x(i+1:n))/A(i,i);
    end  
else
    disp("输入错误,请输入上三角")
end
end

2.2。ガウスの消去法を使用して、AX = b(ピボット要素の選択とピボット要素の非選択を含む)を解決します。
ピボット要素の選択はありません。

%不选主元
digits(9);
A = vpa([10^-8,2,3;-1,3.712,4.623;-2,1.072,5.643]);
b = [1;2;3]';
[m,n]=size(A);
 
%检查方程组是否存在唯一解
if rank(A)~=rank([A,b])
    error('矩阵A的秩和增广矩阵的秩不相同,方程不存在唯一解');
    return;
end
 
%增广矩阵行变换求解
c=n+1;
A(:,c)=b; 

%高斯消元
for k=1:n-1
    A(k+1:n, k:c) = A(k+1:n, k:c)-(A(k+1:n,k)/ A(k,k))*A(k, k:c)
end
 
%回代求结果
x=zeros(length(b),1);  
x(n)=A(n,c)/A(n,n);
for k=n-1:-1:1
x(k)=(A(k,c)-A(k,k+1:n)*x(k+1:n))/A(k,k);
end
 
%计算结果
disp('x=');
disp(x);

実行結果:
ここに画像の説明を挿入
ピボットを選択します

%选主元
clc;clear all;
 
A = [10^-8,2,3;-1,3.712,4.623;-2,1.072,5.643];
b = [1;2;3];
 
n = length(A);
m = zeros(n);%存放行乘数
 
format long
for k = 1:n-1
    temp = abs(A(k:n,k));%比较绝对值的最大值
    [value index] = max(temp);%选主元
    u = index + k - 1;%调整为正确的最大行的索引
    if u ~= k %选主元,换行
        temp1 = A(u,k:n);
        temp2 = b(u);
        A(u,k:n) = A(k,k:n);
        b(u) = b(k);
        A(k,k:n) = temp1;
        b(k) = temp2;
    end 
    m(k+1:n,k) = A( k+1:n,k)/A(k,k);%计算行乘数
    A(k+1:n,k:n) = A(k+1:n,k:n) - m(k+1:n,k)*A(k,k:n);
    b(k+1:n) = b(k+1:n) - m(k+1:n,k)*b(k);
end
slo(A,b);   %调用回代求解过程

演算結果:
ここに画像の説明を挿入
3。行列AのDoolittle分解(ピボット要素の選択とピボット要素の非選択を含む)

function doolittle_1(A)
[row,list] = size(A); 
 
P = eye(row);%置换矩阵P
for k = 1:row-1
    A(k:row,k) = A(k:row,k) - A(k:row,1:k-1) * A(1:k-1,k);
    temp = abs(A(k:row,k));
    [value index] = max(temp);%选主元
    u = index + k - 1;
    if u ~= k %换行
        temp1 = A(u,:);
        A(u,:) = A(k,:);
        A(k,:) = temp1;
        temp1 = P(u,:);
        P(u,:) = P(k,:);
        P(k,:) = temp1;
    end 
    A(k+1:row,k) = A(k+1:row,k) / A(k,k);
    A(k,k+1:list) = A(k,k+1:list) - A(k,1:k-1)*A(1:k-1,k+1);        
end
k = row;
A(k,k:list) = A(k,k:list) - A(k,1:k-1)*A(1:k-1,k:list);
 
L = eye(row);
for i = 2:row
    L(i,1:i-1) = A(i,1:i-1);
end
U = zeros(row);
for i = 1:row
    U(i,i:row) = A(i,i:row);
end
P = vpa(P)
L = vpa(L)
U = vpa(U)

演算結果:
ここに画像の説明を挿入
ここに画像の説明を挿入
4。コレスキー分解

%cholesky分解
function Cholesky(A)
    [N,N]=size(A);
    X=zeros(N,1);
    Y=zeros(N,1);
    for i=1:N
        A(i,i)=sqrt(A(i,i)-A(i,1:i-1)*A(i,1:i-1)');
        for j=i+1:N
            A(j,i)=(A(j,i)-A(j,1:i-1)*A(i,1:i-1)')/A(i,i);
        end
    end
for x=1:N
    for y=1:N
        B(x,y)=A(x,y);      
        if x<y
            B(x,y)=0;
            break;
        end
    end
end
L=vpa(B) 

演算結果:
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_46837674/article/details/113031515