2016-11-15 46 views
5

Tôi đang viết một số mã C# sử dụng MathNet.Numerics.LinearAlgebra và cố gắng so khớp kết quả với ví dụ về sách giáo khoa. Một phần của mã lệnh thực hiện một đảo ngược của một mảng complex32 "Ybus", và lưu trữ nó trong một mảng "Zbus":Ma trận nghịch đảo bằng cách sử dụng MathNet.Numerics

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

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

My Ybus phù hợp chính xác ví dụ trong cuốn sách.

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

Nhưng khi tôi làm một đảo ngược

Zbus = Ybus.Inverse(); 

kết quả Zbus đều NaN

trong khi kết quả chính xác từ cuốn sách trông như thế này:

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

Bất cứ ai có bất kỳ ý tưởng nào về vấn đề này không? Có lẽ đảo ngược của một ma trận phức tạp có một số vấn đề?

enter image description here

Bài học kinh nghiệm: không làm cho mảng của bạn quá lớn để họ có hàng 0 hay nghịch đảo sẽ thổi lên :) ... Dưới đây là câu trả lời đúng:

enter image description here

+0

Có vẻ như để làm việc tốt cho tôi. Tôi đoán là 'Ybus' của bạn không phải là những gì bạn nghĩ. Vì bạn không cho biết cách bạn đang cư trú 'Ybus' hoặc cách bạn xác định rằng đó là những gì bạn yêu cầu, thật khó để nói chính xác vấn đề là gì. –

+0

Cảm ơn. Tôi đoán tôi có đủ danh tiếng để đăng một hình ảnh, vì vậy tôi chỉ đăng một ảnh chụp màn hình của giao diện điều khiển in của các yếu tố của mảng. Lạ ... sự khác biệt duy nhất giữa hai mảng là hoạt động nghịch đảo. Trừ khi có gì đó lạ dưới mui xe của mảng đầu vào của tôi .. –

+0

Và btw, cùng một phương pháp/chức năng được sử dụng trong cả hai trường hợp để in các phần tử mảng, do đó, nó không giống như có một vấn đề với định dạng in ấn hoặc một cái gì đó ... hãy suy nghĩ –

Trả lời

2

Như Jason đã đề cập, điều này dường như hoạt động tốt. Ví dụ:

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"); 

Cung cấp đầu ra sau đây, phù hợp với kết quả sách của bạn (trừ trường hợp làm tròn xấu trong cuốn sách):

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

Cảm ơn Christoph. Xin lỗi cho các báo động giả. Kích thước mảng của tôi quá lớn và hàng số không gây ra lỗi nghịch đảo. Oh, và làm tròn xấu là tôi quá lười biếng để gõ 8 chữ số cho mỗi số :) Bằng cách này, cảm ơn rất nhiều cho thư viện MathNet tuyệt vời này. Đó là một sự trợ giúp rất lớn cho các kỹ sư của chúng tôi, những người không muốn viết mã chi tiết cho những thứ như đảo ngược ma trận. –

Các vấn đề liên quan