목차
1.실습과정
2. 실습결과
□ C++ Coding
2. 실습결과
□ C++ Coding
본문내용
16
-0.009
3
0.015
0.007
4
-0.019
-0.013
5
0.004
-0.018
6
-0.002
0.019
7
0
-0.015
8
0.008
0.0235
<오차 분석>
#include //헤더파일 선언
using namespace std;
double X=0,Y=0; // 변수선언부분
double X_=0,Y_=0;
double x[6][1]={0};
double A[16][6]={11528,10723,1,0,0,0,
0,0,0,11528,10723,1,
1436,10677,1,0,0,0,
0,0,0,1436,10677,1,
1491,582,1,0,0,0,
0,0,0,1491,582,1,
11586,626,1,0,0,0,
0,0,0,11586,626,1,
6480,10985,1,0,0,0,
0,0,0,6480,10985,1,
1178,5629,1,0,0,0,
0,0,0,1178, 5629,1,
6540,318,1,0,0,0,
0,0,0,6540,318,1,
11842,5677,1,0,0,0,
0,0,0,11842,5677,1};
double L[16][1]={105.999,-105.998 ,
-105.997,-105.998 ,
-105.997,105.996 ,
106.003,106.003 ,
0.000,-111.999 ,
-111.995,0.003 ,
0.003,111.993 ,
112.000,0.004 };
double B[6][16];
double C[6][16];
double res[6][6]={0};
double E[6][6]={0};
void trans(double A[16][6],double B[6][16]); // 함수선언부분
void makeE(double E[6][6]);
void Eliment(double res[][6],double E[][6],int size);
void Makeone(double res[][6],double E[][6],int size);
void Cal(double res[][6],double E[][6],int size);
void multi(double result[6][6], double A[16][6], double B[6][16]);
void multi2(double x[6][1], double B[6][16],double L[16][1],double C[6][16]);
void main() // 메인함수
{
trans(A,B);
multi(res, A, B);
makeE(E);
Eliment(res,E,6);
Makeone(res,E,6);
Cal(res,E,6);
cout<<" x ="<
multi2(x,B,L,C);
cout<
cin>>X;
cout<
cin>>Y;
X_=X*x[0][0]+Y*x[1][0]+x[2][0];
Y_=X*x[3][0]+Y*x[4][0]+x[5][0];
cout<<"X="<
}
void trans(double A[16][6],double B[6][16]){ // 행렬 트랜스를 위한 함수
for (int i=0;i<16;++i){
for (int j=0;j<6;++j){
B[j][i] = A[i][j];
}
}
}
void makeE(double E[6][6]){
for (int i=0;i<6;++i ){ // 단위 행렬 만들기
for (int j = 0; j < 6; ++j ){
if(i==j)
E[j][i]=1;
}
}
}
void multi(double result[6][6], double A[16][6], double B[6][16]) // 행렬 곱셈을 위한 함수 (A'*A)
{
int i, j, k;
for(j=0;j<6;j++)
for(k=0;k<6;k++){
result[j][k]=0;
for(i=0;i<16;i++)
res[j][k] += B[j][i] * A[i][k];
}
}
void Eliment(double res[][6],double E[][6],int size) // 가우스 조단 실행함수 (아래 0만들기)
{
double factor=0;
for(int k=0;k<=4;k++){
for(int i=k+1;i<=5;i++){
factor=res[i][k]/res[k][k];
for(int j=0;j<=5;j++){
res[i][j]-=factor* res[k][j];
E[i][j]-=factor*E[k][j];
}
}
}
}
void Makeone(double res[][6],double E[][6],int size) // 가우스 조단 실행함수 (가운데 1만들기)
{
for(int i=0;i<=5;i++){
double factor=1;
factor*=1/res[i][i];
for(int k=0;k<=5;k++){
res[i][k]*=factor;
E[i][k]*=factor;
}
}
}
void Cal(double res[][6],double E[][6],int size) // 가우스 조단 실행함수 (위쪽 0만들기)
{
double factor=0;
for(int i=5;i>0;i--){
for(int j=i-1;j>=0;j--){
factor=res[j][i];
res[j][i]-=factor*res[i][i];
for(int k=0;k<=5;k++)
E[j][k]-=factor*E[i][k];
}
}
}
void multi2(double x[6][1], double B[6][16],double L[16][1],double C[6][16])
{// 행렬의 곱셈을 위한 함수 invA*A'*L
int i, j, k;
for(j=0;j<6;j++)
for(k=0;k<16;k++){
for(i=0;i<6;i++)
C[j][k] += E[j][i] * B[i][k];
}
for(j=0;j<6;j++)
for(k=0;k<1;k++){
for(i=0;i<16;i++)
x[j][k] += C[j][i] * L[i][k];
cout<<" "<
}
cout<
}
-0.009
3
0.015
0.007
4
-0.019
-0.013
5
0.004
-0.018
6
-0.002
0.019
7
0
-0.015
8
0.008
0.0235
<오차 분석>
#include
using namespace std;
double X=0,Y=0; // 변수선언부분
double X_=0,Y_=0;
double x[6][1]={0};
double A[16][6]={11528,10723,1,0,0,0,
0,0,0,11528,10723,1,
1436,10677,1,0,0,0,
0,0,0,1436,10677,1,
1491,582,1,0,0,0,
0,0,0,1491,582,1,
11586,626,1,0,0,0,
0,0,0,11586,626,1,
6480,10985,1,0,0,0,
0,0,0,6480,10985,1,
1178,5629,1,0,0,0,
0,0,0,1178, 5629,1,
6540,318,1,0,0,0,
0,0,0,6540,318,1,
11842,5677,1,0,0,0,
0,0,0,11842,5677,1};
double L[16][1]={105.999,-105.998 ,
-105.997,-105.998 ,
-105.997,105.996 ,
106.003,106.003 ,
0.000,-111.999 ,
-111.995,0.003 ,
0.003,111.993 ,
112.000,0.004 };
double B[6][16];
double C[6][16];
double res[6][6]={0};
double E[6][6]={0};
void trans(double A[16][6],double B[6][16]); // 함수선언부분
void makeE(double E[6][6]);
void Eliment(double res[][6],double E[][6],int size);
void Makeone(double res[][6],double E[][6],int size);
void Cal(double res[][6],double E[][6],int size);
void multi(double result[6][6], double A[16][6], double B[6][16]);
void multi2(double x[6][1], double B[6][16],double L[16][1],double C[6][16]);
void main() // 메인함수
{
trans(A,B);
multi(res, A, B);
makeE(E);
Eliment(res,E,6);
Makeone(res,E,6);
Cal(res,E,6);
cout<<" x ="<
cout<
cout<
X_=X*x[0][0]+Y*x[1][0]+x[2][0];
Y_=X*x[3][0]+Y*x[4][0]+x[5][0];
cout<<"X="<
void trans(double A[16][6],double B[6][16]){ // 행렬 트랜스를 위한 함수
for (int i=0;i<16;++i){
for (int j=0;j<6;++j){
B[j][i] = A[i][j];
}
}
}
void makeE(double E[6][6]){
for (int i=0;i<6;++i ){ // 단위 행렬 만들기
for (int j = 0; j < 6; ++j ){
if(i==j)
E[j][i]=1;
}
}
}
void multi(double result[6][6], double A[16][6], double B[6][16]) // 행렬 곱셈을 위한 함수 (A'*A)
{
int i, j, k;
for(j=0;j<6;j++)
for(k=0;k<6;k++){
result[j][k]=0;
for(i=0;i<16;i++)
res[j][k] += B[j][i] * A[i][k];
}
}
void Eliment(double res[][6],double E[][6],int size) // 가우스 조단 실행함수 (아래 0만들기)
{
double factor=0;
for(int k=0;k<=4;k++){
for(int i=k+1;i<=5;i++){
factor=res[i][k]/res[k][k];
for(int j=0;j<=5;j++){
res[i][j]-=factor* res[k][j];
E[i][j]-=factor*E[k][j];
}
}
}
}
void Makeone(double res[][6],double E[][6],int size) // 가우스 조단 실행함수 (가운데 1만들기)
{
for(int i=0;i<=5;i++){
double factor=1;
factor*=1/res[i][i];
for(int k=0;k<=5;k++){
res[i][k]*=factor;
E[i][k]*=factor;
}
}
}
void Cal(double res[][6],double E[][6],int size) // 가우스 조단 실행함수 (위쪽 0만들기)
{
double factor=0;
for(int i=5;i>0;i--){
for(int j=i-1;j>=0;j--){
factor=res[j][i];
res[j][i]-=factor*res[i][i];
for(int k=0;k<=5;k++)
E[j][k]-=factor*E[i][k];
}
}
}
void multi2(double x[6][1], double B[6][16],double L[16][1],double C[6][16])
{// 행렬의 곱셈을 위한 함수 invA*A'*L
int i, j, k;
for(j=0;j<6;j++)
for(k=0;k<16;k++){
for(i=0;i<6;i++)
C[j][k] += E[j][i] * B[i][k];
}
for(j=0;j<6;j++)
for(k=0;k<1;k++){
for(i=0;i<16;i++)
x[j][k] += C[j][i] * L[i][k];
cout<<" "<
cout<