2016-11-15 14 views
5

MathNet.Numerics.LinearAlgebra를 사용하고 교과서 예제와 결과를 일치시키려는 C# 코드를 작성 중입니다. 코드의 한 부분은 다른 배열 "Zbus"에 complex32 배열 "Ybus", 저장을의 반전을 수행Matrix Inverse using MathNet.Numerics

Matrix<Complex32> Ybus = Matrix<Complex32>.Build.Dense(numBuses, numBuses); 

Matrix<Complex32> Zbus = Matrix<Complex32>.Build.Dense(numBuses, numBuses); 

내 Ybus이 책에 정확히 예 일치합니다.

Ybus = j[ -13  5  4  0 
      5 -13.5 2.5  2 
      4  2.5  -9 2.5 
      0  2 2.5 -4.5] 

하지만 반전을 수행 할 때 책에서 올바른 결과는 다음과 같습니다 동안 Zbus의

Zbus = Ybus.Inverse(); 

결과는 모든 NaN이

있습니다

Zbus = j[ .15  .09 .12 .11 
      .09  .15 .12 .13 
      .12  .12 .25 .19 
      .11  .13 .19 .39] 

사람 어떤 이슈가 있을지 아이디어가 있습니까? 어쩌면 복잡한 행렬의 반전에는 몇 가지 문제가 있습니까?

enter image description here

수업은 배운 :

enter image description here

: 그들은 공의 또는 역을 날려 버리겠다 ... :)의 행이 있도록 배열이 너무 크게하지 않습니다 여기에 정답이다
+0

나를 위해 잘 작동하는 것 같다. 내 생각 엔 당신의'이브 스 (Ybus)'가 당신이 생각하는 것과 다르다는 것입니다. 당신이'Ybus '를 어떻게 채우고 있는지, 또는 그것이 당신이 주장하는 바를 어떻게 결정했는지 보여주지 않으므로 문제가 정확히 무엇인지 말할 수 없습니다. –

+0

감사합니다. 이미지를 게시하기에 충분한 평판을 얻었 기 때문에 배열 요소의 콘솔 인쇄 스크린 샷을 게시했습니다. 이상한 ... 두 배열 사이의 유일한 차이점은 Inverse 연산입니다. 내 입력 배열의 후드 아래 뭔가 이상한 게 없다면 .. –

+0

그리고 btw, 두 가지 경우 모두 동일한 메소드/함수가 배열 요소를 인쇄하는 데 사용되므로 인쇄 형식이나 다른 문제가있는 것처럼 보이지 않습니다. 생각한다 –

답변

2

제이슨 (Jason)이 언급했듯이 이것은 정상적으로 작동하는 것 같습니다. 예를 들어 :

var y = Complex32.ImaginaryOne * CreateMatrix.Dense(4, 4, new Complex32[] {-13f,5f,4f,0f,5f,-13.5f,2.5f,2f,4f,2.5f,-9f,2.5f,0f,2f,2.5f,-4.5f}); 
y.ToString("F3"); 
y.Inverse().ToString("F3"); 

는 (책에서 나쁜 라운딩을 제외하고) 당신의 책 결과와 일치, 다음과 같은 출력을 제공합니다 :

DenseMatrix 4x4-Complex32 
(0.000, -13.000) (0.000, 5.000) (0.000, 4.000) (0.000, 0.000) 
    (0.000, 5.000) (0.000, -13.500) (0.000, 2.500) (0.000, 2.000) 
    (0.000, 4.000) (0.000, 2.500) (0.000, -9.000) (0.000, 2.500) 
    (0.000, 0.000) (0.000, 2.000) (0.000, 2.500) (0.000, -4.500) 

DenseMatrix 4x4-Complex32 
(0.000, 0.153) (0.000, 0.097) (0.000, 0.126) (0.000, 0.113) 
(0.000, 0.097) (0.000, 0.153) (0.000, 0.124) (0.000, 0.137) 
(0.000, 0.126) (0.000, 0.124) (0.000, 0.256) (0.000, 0.197) 
(0.000, 0.113) (0.000, 0.137) (0.000, 0.197) (0.000, 0.393) 
+1

Thanks Christoph. 거짓 경보로 유감입니다. 배열 크기가 너무 커서 제로 열이 반전되어 실패합니다. 아, 나쁜 반올림은 각 숫자에 대해 8 자리 숫자를 입력하기에는 너무 게으름이었습니다. 그런데이 멋진 MathNet 라이브러리에 대해 많은 감사를드립니다. 매트릭스 반전과 같은 세부 코드를 작성하고 싶지 않은 엔지니어에게는 큰 도움이됩니다. –