목차
1.크래머규칙
2.가우스소거법
3.LU분해법
4.LU분해법으로 역행렬구하기
5.소스코드
2.가우스소거법
3.LU분해법
4.LU분해법으로 역행렬구하기
5.소스코드
본문내용
하여, 의 를 구하면 와 같으므로 역행렬을 구할 수 있다.
접근 2. LU분해법으로 A행렬의 역행렬 X를 구해보자.
Doolittle분해법으로 [L]과 [U]를 구해보자
--
// 에서 미지 요소를 채워 넣어야한다.
에서
[L]과 [U]를 구해보면 다음과 같다.
1열을 구해보면
에서 이 도출되고,
2열을 구해보면
에서 이 도출되고,
2열을 구해보면
에서 이 도출되고,
결론 a.
검증. LU분해법으로 역행렬구하기의 matlab 검증
결론 b.
최종 결과
하나하나가 조금 까다로운 문제였던 것 같다. 물론 계산하는 원리도 중요하겠지만, 계산하는데 있어 까다로운 문제이므로 실수하지 않고 꼼꼼히 계산하는 것이 중요한 부분이다. 또한 소수점아랫자리를 사용하여 계산하는 것도 좋지만 이는 오차에 따라 값이 달라질 가능성이 존재하므로 처음부터 분수를 이용해서 계산하는 게 오답을 피할 수 있는 방법 중 하나이다.
% 크래머 공식(Cramer's rule)
clear all
clc
fprintf('Ax=B의 형태의 방정식을 크래머 공식으로 풀기 \n')
fprintf(' 1x + 2y + 3z = 1 \n 11x + 24y + 37z = 7 \n 121x + 243y + 364z = 120 \n\n')
a=[1, 2, 3; 11, 24, 37; 121, 243, 364];
x=det([1, 2, 3; 7, 24, 37; 120, 243, 364])/det(a);
y=det([1, 1, 3; 11, 7, 37; 121, 120, 364])/det(a);
z=det([1, 2, 1; 11, 24, 7; 121, 243, 120])/det(a);
fprintf(' D=%2.0f , x=%0.4f , y=%0.4f , z=%0.4f \n',det(a), x, y, z);
% 가우스 소거법
clear all
clc
fprintf('Ax=B의 형태의 방정식을 가우스 소거법으로 풀기 \n')
fprintf(' 1x + 2y + 3z = 1 \n 11x + 24y + 37z = 7 \n 121x + 243y + 364z = 120 \n')
A=[1, 2, 3; 11, 24, 37; 121, 243, 364];
B=[1; 7; 120];
fprintf('A=[1, 2, 3; 11, 24, 37; 121, 243, 364] \n B=[1; 7; 120]\n')
format long
[n,n2]=size(A);
[t2,t]=size(B);
x=zeros(n,t);
pnum=0;
for i=1:n-1
[p,k]=max(abs(A(i:n,i)));
if k>1 %피보팅연산
T1=A(i,:);
A(i,:)=A(i+k-1,:);
A(i+k-1,:)=T1;
T2=B(i,:);
B(i,:)=B(i+k-1,:);
B(i+k-1,:)=T2;
fprintf('피보팅 실시\n')
pnum=pnum+1;
end
for z=i+1:n;
m=A(z,i)/A(i,i);
A(z,:)=A(z,:)-m*A(i,:);
B(z,:)=B(z,:)-m*B(i,:);
end
end
D=det(A); %불량조건 특이조건 판별
if abs(D)<0.0000001
fprintf('행렬의 불량조건/특이조건 만족여부 조사 -> 불량조건/특이조건이므로 연산을 하지않습니다\n')
else
fprintf('행렬의 불량조건/특이조건 만족여부 조사 -> 불량조건/특이조건이 아니므로 연산을 계속하겠습니다.\n')
x(n,:)=B(n,:)./A(n,n); % 후진대입
for l=n-1:-1:1
x(l,:)=(B(l,:)-A(l,l+1:n)*x(l+1:n))./A(l,l);
end
end
fprintf('해는 다음과 같습니다.\n')
x
fprintf('피보팅한 횟수')
fprintf('총 %g 회 피보팅하엿음.',pnum)
clear all % LU분해법 Doolittle법
clc
fprintf('Ax=B의 형태의 방정식을 LU분해법 으로 풀기 \n')
fprintf(' 1x + 2y + 3z = 1 \n 11x + 24y + 37z = 7 \n 121x + 243y + 364z = 120 \n')
A=[1, 2, 3; 11, 24, 37; 121, 243, 364];
b=[1; 7; 120];
n=length(A);
L=zeros(n,n);U=zeros(n,n);
for i=1:n %[L] , [U]
for j=1:n
if i==j
L(i,j)=1;
else
L(i,j)=0;
end
if i==1
U(i,j)=A(i,j);
else
U(i,j)=0;
end
end
end
for i = 2:n
for j=1:n
if i>j
L(i,j)=(A(i,j)-L(i,:)*U(:,j))/U(j,j);
else
U(i,j)=A(i,j)-L(i,:)*U(:,j);
end
end
end
L , U
d=zeros(n,1); x=zeros(n,1);
for i=1:n
d(i)=(b(i)-L(i,:)*d)/L(i,i);
end
fprintf('[d]행렬\n')
d
for i=n:-1:1
x(i)=(d(i)-U(i,:)*x)/U(i,i);
end
fprintf('해 \n')
x
% LU분해법(Doolittle)으로 역행렬 구하기
clear all
clc
A=[1, 2, 3; 11, 24, 37; 121, 243, 364];
B=[1; 7; 120];
n=length(A);
L=zeros(n,n);
U=zeros(n,n);
for i=1:n
for j=1:n
if i==j
L(i,j)=1;
else L(i,j)=0;
end
if i==1
U(i,j)=A(i,j);
else U(i,j)=0;
end
end
end
for i=2:n
for j=1:n
if i>j
L(i,j)=(A(i,j)-L(i,:)*U(:,j))/U(j,j);
else
U(i,j)=A(i,j)-L(i,:)*U(:,j);
end
end
end
E=[1, 0, 0; 0, 1, 0; 0, 0, 1]; %역행렬구하기
D=L^(-1)*E;
fprintf('\n [d]행렬 \n');
disp(D);
fprintf('\n A함수의 역행렬 \n');
Ainv=U^(-1)*D;
disp(Ainv);
접근 2. LU분해법으로 A행렬의 역행렬 X를 구해보자.
Doolittle분해법으로 [L]과 [U]를 구해보자
--
// 에서 미지 요소를 채워 넣어야한다.
에서
[L]과 [U]를 구해보면 다음과 같다.
1열을 구해보면
에서 이 도출되고,
2열을 구해보면
에서 이 도출되고,
2열을 구해보면
에서 이 도출되고,
결론 a.
검증. LU분해법으로 역행렬구하기의 matlab 검증
결론 b.
최종 결과
하나하나가 조금 까다로운 문제였던 것 같다. 물론 계산하는 원리도 중요하겠지만, 계산하는데 있어 까다로운 문제이므로 실수하지 않고 꼼꼼히 계산하는 것이 중요한 부분이다. 또한 소수점아랫자리를 사용하여 계산하는 것도 좋지만 이는 오차에 따라 값이 달라질 가능성이 존재하므로 처음부터 분수를 이용해서 계산하는 게 오답을 피할 수 있는 방법 중 하나이다.
% 크래머 공식(Cramer's rule)
clear all
clc
fprintf('Ax=B의 형태의 방정식을 크래머 공식으로 풀기 \n')
fprintf(' 1x + 2y + 3z = 1 \n 11x + 24y + 37z = 7 \n 121x + 243y + 364z = 120 \n\n')
a=[1, 2, 3; 11, 24, 37; 121, 243, 364];
x=det([1, 2, 3; 7, 24, 37; 120, 243, 364])/det(a);
y=det([1, 1, 3; 11, 7, 37; 121, 120, 364])/det(a);
z=det([1, 2, 1; 11, 24, 7; 121, 243, 120])/det(a);
fprintf(' D=%2.0f , x=%0.4f , y=%0.4f , z=%0.4f \n',det(a), x, y, z);
% 가우스 소거법
clear all
clc
fprintf('Ax=B의 형태의 방정식을 가우스 소거법으로 풀기 \n')
fprintf(' 1x + 2y + 3z = 1 \n 11x + 24y + 37z = 7 \n 121x + 243y + 364z = 120 \n')
A=[1, 2, 3; 11, 24, 37; 121, 243, 364];
B=[1; 7; 120];
fprintf('A=[1, 2, 3; 11, 24, 37; 121, 243, 364] \n B=[1; 7; 120]\n')
format long
[n,n2]=size(A);
[t2,t]=size(B);
x=zeros(n,t);
pnum=0;
for i=1:n-1
[p,k]=max(abs(A(i:n,i)));
if k>1 %피보팅연산
T1=A(i,:);
A(i,:)=A(i+k-1,:);
A(i+k-1,:)=T1;
T2=B(i,:);
B(i,:)=B(i+k-1,:);
B(i+k-1,:)=T2;
fprintf('피보팅 실시\n')
pnum=pnum+1;
end
for z=i+1:n;
m=A(z,i)/A(i,i);
A(z,:)=A(z,:)-m*A(i,:);
B(z,:)=B(z,:)-m*B(i,:);
end
end
D=det(A); %불량조건 특이조건 판별
if abs(D)<0.0000001
fprintf('행렬의 불량조건/특이조건 만족여부 조사 -> 불량조건/특이조건이므로 연산을 하지않습니다\n')
else
fprintf('행렬의 불량조건/특이조건 만족여부 조사 -> 불량조건/특이조건이 아니므로 연산을 계속하겠습니다.\n')
x(n,:)=B(n,:)./A(n,n); % 후진대입
for l=n-1:-1:1
x(l,:)=(B(l,:)-A(l,l+1:n)*x(l+1:n))./A(l,l);
end
end
fprintf('해는 다음과 같습니다.\n')
x
fprintf('피보팅한 횟수')
fprintf('총 %g 회 피보팅하엿음.',pnum)
clear all % LU분해법 Doolittle법
clc
fprintf('Ax=B의 형태의 방정식을 LU분해법 으로 풀기 \n')
fprintf(' 1x + 2y + 3z = 1 \n 11x + 24y + 37z = 7 \n 121x + 243y + 364z = 120 \n')
A=[1, 2, 3; 11, 24, 37; 121, 243, 364];
b=[1; 7; 120];
n=length(A);
L=zeros(n,n);U=zeros(n,n);
for i=1:n %[L] , [U]
for j=1:n
if i==j
L(i,j)=1;
else
L(i,j)=0;
end
if i==1
U(i,j)=A(i,j);
else
U(i,j)=0;
end
end
end
for i = 2:n
for j=1:n
if i>j
L(i,j)=(A(i,j)-L(i,:)*U(:,j))/U(j,j);
else
U(i,j)=A(i,j)-L(i,:)*U(:,j);
end
end
end
L , U
d=zeros(n,1); x=zeros(n,1);
for i=1:n
d(i)=(b(i)-L(i,:)*d)/L(i,i);
end
fprintf('[d]행렬\n')
d
for i=n:-1:1
x(i)=(d(i)-U(i,:)*x)/U(i,i);
end
fprintf('해 \n')
x
% LU분해법(Doolittle)으로 역행렬 구하기
clear all
clc
A=[1, 2, 3; 11, 24, 37; 121, 243, 364];
B=[1; 7; 120];
n=length(A);
L=zeros(n,n);
U=zeros(n,n);
for i=1:n
for j=1:n
if i==j
L(i,j)=1;
else L(i,j)=0;
end
if i==1
U(i,j)=A(i,j);
else U(i,j)=0;
end
end
end
for i=2:n
for j=1:n
if i>j
L(i,j)=(A(i,j)-L(i,:)*U(:,j))/U(j,j);
else
U(i,j)=A(i,j)-L(i,:)*U(:,j);
end
end
end
E=[1, 0, 0; 0, 1, 0; 0, 0, 1]; %역행렬구하기
D=L^(-1)*E;
fprintf('\n [d]행렬 \n');
disp(D);
fprintf('\n A함수의 역행렬 \n');
Ainv=U^(-1)*D;
disp(Ainv);