2014-12-10 3 views
1

교수님은 우리에게 난처한 실험실을 지정해 주셨고 웹에서 도움을 얻을 수 없습니다. 고유 값을 갖는 행렬에 대해 특히 그렇습니다.반복적 인 방법을 사용하는 역 행렬 계산

3x3 행렬 A = {(.5, -1, 0), (0, .6666, 0), (.5, -1, .6666)}, 당신은 A^-1 = I + B + B^2 + B^3 ..... B^20을 사용하여 역함수를 계산해야합니다. 여기서 I는 항등 행렬이고 B = I - A입니다. A^-1 인 출력과 결과를 확인하는 A * A^-1 인 두 개의 출력이 있습니다.

지금까지 곱셈을 위해 두 가지 다른 기능을 시도했습니다. 내 끔찍한 이름을 지어서 미안해. i, j 및 k는 행, 열 및 루프 카운터입니다.

void mPower(double x[][3], double y[][3], double z[][3]) 
{ 
    int i, j, k; 

    for (i = 0; i < 3; i++) 
    for (j = 0; j < 3; j++) { 
     for (k = 0; k < 3; k++) 
     z[i][j] = z[i][j] + (x[i][k] * y[k][j]); 
} 
} 

mPower는 아마도 곱셈을위한 잘못된 함수입니다. 내가 시도한 대안으로

void multiplyMatrix(double x[][3], double y[][3], double z[][3]) 
{ 
    int i, j, k; 
    int sum = 0; 

for (i = 0; i <= 2; i++) { 
    for (j = 0; j <= 2; j++) { 
    sum = 0; 
    for (k = 0; k <= 2; k++) { 
     sum = sum + x[i][k] * y[k][j]; 
    } 
    z[i][j] = sum; 
    } 
    } 

} 

그러나 나는 단지 0을 얻습니다.

void printIt(double a[][3], double b[][3]) 
{ 
int i, j; 

for (i = 0; i < 3; i++) 
{ 
    printf ("\n\t\t\t"); 
    for (j = 0; j < 3; j++) 
     printf ("%7.4f", a[i][j]); 
    printf ("\t"); 
    for (j = 0; j < 3; j++) 
     printf ("%7.4f", b[i][j]); 
     printf ("\n\n\t"); 
} 
} 

int main() 
{ 
    int i, j, k; 
    double b1[][3] = {.5, 1., 0., 0., .6666, 0., -.5, -1., .6666}; 
    double b3[3][3] = {0}; 
    double addOn[3][3]; 
    double aInverse[3][3]; 
    double identity[][3] = {1., 0., 0., 0., 1., 0., 0., 0., 1.}; 
    mPower (b1, b1, b3); 
    for (k = 0; k < 20; k++)  { 
     addOn[i][j] = addOn[i][j] + b3[i][j]; 
     mPower (b1, addOn, b3); 
} 

for (i = 0; i < 3; i++) { 
    for (j = 0; j < 3; j++) 
     aInverse[i][j] = identity[i][j] + addOn[i][j]; 
} 

printIt(b3, aInverse); 
system("pause"); 

return 0; 
} 

PrintIt은 디스플레이 형식을 멋지게 만들었지 만 주요 문제의 for 루프가 걱정됩니다. 나는 무엇을해야할지 주위를 감쌀 수 없다. 나는 그 곳곳에서 가치를 얻고 있으며, 그런 틈새 문제와 관련된 수학을 계산하는 데 어려움을 겪고 있습니다. 어떤 도움을 주시면 감사하겠습니다.

답변

0

로직을 수정하려고했는데 결과 코드가 매우 비효율적이어서 훨씬 더 잘 작성 될 수 있습니다. 내가 찾은 것 같아 몇 가지 문제는 다음과 같습니다

  1. 변수 부가 기능은 당신의 서문에서 B = I-A의 정의 주어진
  2. 귀하의 b는 정확 초기화 (나쁜 빼기)하지 않았다.
  3. addOn = addOn + b3의 누적 값은 초기화되지 않은 i 및 j을 사용하는 이중 루프가 아닙니다. 수학 정확한되지 않도록 우리가 IEEE 배정 밀도 번호를 사용하고 있기 때문에
  4. 당신은 역 검사를하지 않는 것 (A * a를^-1) = 나는

(참고, 나는 -0.000 무엇입니까 . 그 분에 관해서 특히)

#include <stdio.h> 

void mPower(double x[3][3], double y[3][3], double z[3][3]) 
{ 
    int i, j, k; 

    for (i = 0; i < 3; i++) 
    for (j = 0; j < 3; j++) { 
     z[i][j] = 0; 
     for (k = 0; k < 3; k++) 
     z[i][j] += (x[i][k] * y[k][j]); 
} 
} 

void mAdd(double x[3][3], double y[3][3]) 
{ 
    int i, j; 
    for (i = 0; i < 3; i++) 
    for (j = 0; j < 3; j++) 
     x[i][j] += y[i][j]; 
} 

void mCopy(double x[3][3], double y[3][3]) 
{ 
    int i, j; 
    for (i = 0; i < 3; i++) 
    for (j = 0; j < 3; j++) 
     x[i][j] = y[i][j]; 
} 

void printIt(double a[3][3], double b[3][3]) 
{ 
int i, j; 

for (i = 0; i < 3; i++) 
{ 
    printf ("\n\t\t\t"); 
    for (j = 0; j < 3; j++) 
     printf ("%7.4f", a[i][j]); 
    printf ("\t"); 
    for (j = 0; j < 3; j++) 
     printf ("%7.4f", b[i][j]); 
     printf ("\n\n\t"); 
} 
} 

int main() 
{ 
    int i, j, k; 
    double a[3][3] = {.5, -1., 0., 0., .6666, 0., .5, -1., .6666}; 
    double b1[3][3] = {.5, 1., 0., 0., 1-.6666, 0., -.5, 1., 1-.6666}; 
    double b3[3][3] = {0}; 
    double addOn[3][3] = {0}; 
    double aInverse[3][3] = {0}; 
    double identity[][3] = {1., 0., 0., 0., 1., 0., 0., 0., 1.}; 
printIt(aInverse, b1); 
    mAdd(aInverse, identity); 
printIt(aInverse, b1); 
    mCopy(b3, b1); 
    mCopy(addOn, b1); 
    for (k = 0; k < 20; k++)  { 
    mAdd(aInverse, addOn); 
    mPower(b3, b1, addOn); 
    mCopy(b3, addOn); 
printf("loop iteration %d\n", k); 
printIt(aInverse, addOn); 
} 
printf("aInverse\n"); 
printIt(b1, aInverse); 
printf("verify\n"); 
mPower(a,aInverse,b3); 
printIt(a,b3); 

return 0; 
} 

결과를 내가 가지고 :

aInverse 

     0.5000 1.0000 0.0000 2.0000 3.0003 0.0000 


     0.0000 0.3334 0.0000 0.0000 1.5002 0.0000 


     -0.5000 1.0000 0.3334 -1.5001 0.0000 1.5002 

verify 

     0.5000-1.0000 0.0000 1.0000-0.0000 0.0000 


     0.0000 0.6666 0.0000 0.0000 1.0000 0.0000 


     0.5000-1.0000 0.6666 0.0000 0.0000 1.0000 
+0

은 오 와우, 당신은 물에서 수학을 불었다. 실수로 addOn이 초기화되지 않은 mPower 함수를 사용하여 이전 버전을 게시했지만 나보다 많이 표시 한 것은 아닙니다. 고맙습니다. 당신은 어떻게 -1.5001과 긍정적 인 3.003을 얻고 있습니까? – Dub

+0

사실, 찾았습니다! b1의 처음 1.은 음수이어야하고 -.5는 양수 여야합니다. – Dub