#include <stdio.h>
#include <math.h> // 수학적 계산이 있기때문에 사용
#include <stdlib.h>
void Jacobi(int, int, double); // Jacobi-방법으로 실행하는 서브루틴을 설정
double A[50][51]; // 입력행렬을 광역변수로 선언하고 아래삼각행렬 L로 대치됨
double x[50]; // 해벡터를 광역 변수로 선언
void main(void)
{
int i, j, n, Max; // n : 행렬의 크기, Max : 최대 반복횟수
double esp, sum; // esp : 허용오차
// 정사각행렬 A의 크기를 입력
printf("행렬 A의 크기는얼마인가? ");
scanf("%d", &n);
// 행렬 A의 원소를 입력
printf("\n행렬 A의 성분은? \n");
for(i=0;i<n;i++){
printf("%d 행 : ",i+1);
for(j=0;j<n;j++)
scanf("%lf", &A[i][j]);
}
// 벡터 b를 입력, 편의상 b[i]=A[i][n]으로 놓는다.
printf("b의 성분은? \n");
for(i=0;i<n;i++)
scanf("%lf",&A[i][n]);
//입력된 행렬이 "강대각지배행렬"인지를 확인
for(i=0;i<n;i++){
sum=0.;
for(j=0;j<n;j++){
if(i!=j)
sum=sum+fabs(A[i][j]);
}
}
// 최대반복 횟수 Max의 값을 입력
printf("\n최대반복회수 Max는? ");
scanf("%d", &Max);
// 허용오차 esp를 입력
printf("\n허용오차의 한계는? ");
scanf("%lf", &esp);
// 초기치 벡터 x를 입력
printf("\n초기벡터의 성분은 : \n");
for(i=0;i<n;i++)
scanf("%lf", &x[i]);
Jacobi(n, Max, esp); // Jacobi-방법을 실행 할 수 있는 서브루틴을 호출
}
// Jacobi-방법
void Jacobi(int n, int Max, double esp)
{
int i, j, k;
double sum, norm, next_x[50];
for(k=1;k<=Max;k++){
printf("\nk = %d \n", k);
for(i=0;i<n;i++){
sum=0.;
for(j=0;j<n;j++){
if(i!=j)
sum=sum+A[i][j]*x[j];
}
next_x[i]=(A[i][n]-sum)/A[i][i];
printf("%lf \t", next_x[i]);
}
// 2차_norm 으로 오차를 계산.
norm = 0.;
sum = 0.;
for(i=0;i<n;i++){
for(j=0;j<n;j++)
sum = sum + pow(A[i][j],2);
}
norm = pow(sum,0.5);
if(norm <= esp) // 허용오차보다 오차가 적으면 실행을 중단
{
printf("norm=%lf \n", norm);
return;
}
for(i=0;i<n;i++)
x[i]=next_x[i];
}
printf("norm=%lf \n", norm);
getchar();
system("pause");
return;
}
-------------------------------------------------
지금 행렬이
3x3이고
(x1)+7(x2)-4(x3)=-51
4(x1)-4(x2)+9(x3)=62
12(x1)-(x2)+3(x3)=8
여기서 x1 ,x2,x3를 구하는게 문제입니다
행렬의크기는 3
허용오차 0.00001
초기벡터 0 0 0
최대횟수 10 회로 설정했더니
이렇게됩니다 왜 자꾸 해가 커지는건가요?
어디부분이 잘못 코딩됬나요?
C는 나눗셈오차 존나크지않냐? 맽렙이나써
이렇게어려운걸 왜하냐
L2 norm 오차 계산 틀림
숙제는 자기 힘으로 하자