Ý tưởng cơ bản khá đơn giản. Bạn sắp xếp một ma trận ( ) đại diện cho "các nút" hoặc các đỉnh trong hệ thống của bạn. Mỗi nút này có một "điện áp" có giá trị vô hướng được liên kết với nó có thể được thay đổi hoặc cập nhật khi tiến hành thuật toán. Cũng sẽ có hai nút mà điện áp không thể thay đổi. Chúng ta sẽ áp dụng một "loại pin" ở đây, vì vậy hai nút đó đại diện cho hai đầu của pin này.V
Một cách riêng biệt, hai ma trận khác ( và R h ) đại diện cho các cạnh trong hệ thống, ngang và dọc. Đây là những giá trị kháng chiến của bạn, tôi đoán. Tôi không chắc bạn dự định điền những thứ này như thế nào. Nhưng đó là vấn đề của bạn. Kỹ thuật này giả định rằng bạn cũng có thể điền vào các ma trận này.R vR h
Tùy thuộc vào ngôn ngữ máy tính bạn sử dụng, bạn có thể hoặc không thể sử dụng các chỉ số tiêu cực. Không quan trọng. Đó chỉ là vấn đề ghi nhớ những gì bạn đang phải đối mặt.
Giả sử chiều dài được chia thành N L phần và rằng "chiều dài" Một được chia thành N Một phần. Sau đó, bạn sẽ cần phải xây dựng một ma trận với ( N L + 1 ) ⋅ ( N A + 1 ) đỉnh cho các giá trị điện áp vô hướng. (hoặc lớn hơn). Bạn cũng sẽ cần những hai ma trận khác với N Một ⋅ ( N L + 1 ) các cạnh thẳng đứng và N L ⋅ ( N A + 1LNLMộtNMột( NL+ 1 ) ⋅ ( NMột+ 1 )NMột⋅ ( NL+ 1 ) các cạnh ngang giữa các đỉnh đó.NL⋅ ( NMột+ 1 )
Hiện nay. Khởi tạo tất cả các đỉnh bằng . Chọn một trong các đỉnh bên trái (tốt nhất là ở giữa) và lưu ý nó là 00VGiá trị V KHÔNG được phép thay đổi. Sử dụng bất cứ phương pháp nào bạn muốn cho việc này. Chọn một trong các đỉnh bên phải (tốt nhất là ở giữa) và thay đổi giá trị của nó thành 10V , trong khi một lần nữa lưu ý rằng giá trị của nó KHÔNG được phép thay đổi. Một kỹ thuật hoạt động ở đây là chỉ cần để nó thay đổi bình thường nhưng sau đó thay thế giá trị từng bước. Nhưng nó không quan trọng bằng cách bạn đạt được điều này, miễn là bạn đạt được nó.1V
(Có những kỹ thuật khác vì lý do hiệu quả. Nhưng có lẽ không đáng bận tâm với chúng ở đây.)
Bây giờ đối với thuật toán, đôi khi được gọi là bảng kiểm tra hoặc thuật toán đỏ-đen . Di chuyển qua ma trận điện áp nút của bạn, xử lý từng nút trong đó tổng của hai chỉ số, là chẵn, thực hiện phép gán đơn giản sau:tôi + j
Vtôi , j= R hi , j - 1⋅ R htôi , j⋅ ( Vi−1,j⋅Rvi,j+Vi+1,j⋅Rvi−1,j)Rhi,j−1⋅Rhi,j⋅(Rvi,j+Rvi−1,j)+Rvi−1,j⋅Rvi,j(Rhi,j+Rhi,j−1)+Rvi−1,j⋅Rvi,j⋅(Vi,j−1⋅Rhi,j+Vi,j+1⋅Rhi,j−1)Rhi,j−1⋅Rhi,j⋅(Rvi,j+Rvi−1,j)+Rvi−1,j⋅Rvi,j(Rhi,j+Rhi,j−1)
Phương trình trên không gì khác hơn là tính toán điện áp của một nút trung tâm có bốn điện trở kết nối với nó, trong đó các điện áp ở hai đầu khác của bốn điện trở được biết đến. Điện áp nút trung tâm sau đó được tính từ phương trình trên. Vì ước số là giống nhau cho mỗi số hạng, bạn chỉ cần tính tổng của các tử số và sau đó chia một lần cho mẫu số.
Điều đó sẽ cập nhật tất cả các nút trong đó tổng là chẵn. Bây giờ bạn thực hiện cùng một quy trình cho tất cả các nút trong đó tổng i + j là số lẻ. Khi cả hai bước này đã được thực hiện, bạn đã hoàn thành một chu kỳ.i+ji+j
Nếu cần, đặt lại hai nút đặc biệt (cho và cho 10V như đã thảo luận trước đó.) Hoặc, nếu bạn bảo vệ hai nút đó, không cần thiết lập lại chúng.1V
Bạn đã sẵn sàng cho chu kỳ tiếp theo. Thực hiện các chu kỳ này nhiều lần bạn cảm thấy cần thiết để trạng thái tổng thể ổn định (và nó sẽ.)
Khi bạn dừng quá trình, bạn có thể dễ dàng tìm ra mức kháng cự bằng cách chọn xem xét các nút xung quanh nút được bảo vệ bên trái của bạn hoặc nhìn vào các nút xung quanh nút được bảo vệ bên phải của bạn. (Có thể là một ý tưởng tốt để làm cho ma trận của bạn đủ lớn hơn [1 theo mọi hướng] để bạn thực sự có bốn nút xung quanh một trong hai lựa chọn.) Sự khác biệt về điện áp giữa các nút xung quanh và nút đặc biệt, chia cho điện trở ở các cạnh giữa chúng cho bạn biết hiện tại rời / vào nút đặc biệt của bạn. Vì đây là nút "pin", dòng điện này phải là TẤT CẢ dòng điện. Vì điện áp là , theo định nghĩa, chia 1 cho tổng của bốn dòng điện bạn tìm thấy cho bạn biết tổng trở.1V
Tôi đang nhìn chằm chằm vào một số mã tôi đã viết tổng cộng, với rất nhiều bình luận, chỉ 67 dòng. Vì vậy, nó không khó để viết.
"Tóm tắt ngắn" về ý tưởng này là bạn áp dụng pin và sau đó xem khi các điện áp trải khắp hệ thống. Khi các điện áp ổn định (tiêu chí của bạn cho điều đó), tất cả những gì bạn phải làm là nhìn vào dòng điện đi vào hoặc ra khỏi một cực pin hoặc một cực khác. Cả hai nên có cùng giá trị hiện tại (trong một số giới hạn số) vì những lý do rõ ràng.1V
Tại sao bạn phải tách hệ thống thành i + j = chẵn và i + j = lẻ?
Giả sử bạn tính . Điều này tham chiếu các nút bao quanh V 5 , 5 . Tốt rồi. Giả sử bạn tiếp theo tính V 5 , 6 = f ( V 4 , 6 , V 6 , 6 , V 5 ,V5,5=f(V4,5,V6,5,V5,4,V5,6)V5,5 . Lưu ý rằng trong danh sách các tham số là giá trị bạn vừa tính choV 5 , 5 ? Điều này sẽ "làm nhòe" mọi thứ rất nhiều. Đó không phải là âm thanh. Thay vào đó, mỗi chu kỳ lẻ / chẵn sẽ "xuất hiện như thể" nó xảy ra cùng một lúc. Vì vậy, tính toán tiếp theo của bạn phải làV 5 , 7 =f ( V 4 , 7 , V 6 , 7 , V 5 , 6 , V 5 , 8 )V5,6=f(V4,6,V6,6,V5,5,V5,7)V5,5V5,7=f(V4,7,V6,7,V5,6,V5,8)bởi vì không có đầu vào nào của hàm là các nút được thay đổi trong bước này. Sau đó, bạn xoay quanh và tính toán các thay thế, tránh bị nhòe nhưng hiện đang cập nhật các thay thế. Bạn thực sự phải làm theo cách này.
Ngoài ra, công thức có giống nhau cho cả bước chẵn và lẻ không?
Vâng, nó giống nhau.
Tất cả có thể được giải quyết trong một bước bằng cách sử dụng một số loại hệ thống tuyến tính Ax = b trong đó A là toán tử tuyến tính và b cung cấp các điều kiện biên? Nhìn vào nó, có vẻ hơi giống với các phương pháp sai phân hữu hạn để giải các phương trình vi phân từng phần ..
Có một kết nối. Tôi nghĩ nó được gọi là triển khai 'không ma trận'.
Đây là một ví dụ. Tập hợp các giá trị điện trở sau đây được đặt vào LTSpice để mô phỏng:
1V30.225mA30.224552mA
Tôi đã chạy chương trình VB.NET sau đây:
Module GEOGRID
Const NL As Integer = 2
Const NA As Integer = 2
Const INF As Double = 1.0E+32
Sub Main()
Static Rh As Double(,) = New Double(NL + 2, NA + 1) {
{INF, INF, INF, INF},
{INF, 5, 21, INF},
{INF, 76, 10, INF},
{INF, 32, 22, INF},
{INF, INF, INF, INF}}
Static Rv As Double(,) = New Double(NA + 1, NL + 2) {
{INF, INF, INF, INF, INF},
{INF, 61, 50, 16, INF},
{INF, 56, 45, 18, INF},
{INF, INF, INF, INF, INF}}
Dim V As Double(,) = New Double(NL + 2, NA + 2) {
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 1, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0}}
Dim PDE As Func(Of Integer, Integer, Double) = Function(ByVal i As Integer, ByVal j As Integer) (
Rh(i, j - 1) * Rh(i, j) * (V(i - 1, j) * Rv(i, j) + V(i + 1, j) * Rv(i - 1, j)) +
Rv(i - 1, j) * Rv(i, j) * (V(i, j - 1) * Rh(i, j) + V(i, j + 1) * Rh(i, j - 1))
) / (
Rh(i, j - 1) * Rh(i, j) * (Rv(i, j) + Rv(i - 1, j)) +
Rv(i - 1, j) * Rv(i, j) * (Rh(i, j) + Rh(i, j - 1))
)
Dim IV As Func(Of Integer, Integer, Double) = Function(ByVal i As Integer, ByVal j As Integer) 0 +
(V(i, j) - V(i - 1, j)) / Rv(i - 1, j) + (V(i, j) - V(i + 1, j)) / Rv(i, j) +
(V(i, j) - V(i, j - 1)) / Rh(i, j - 1) + (V(i, j) - V(i, j + 1)) / Rh(i, j)
Dim idx As Integer = NA \ 2 + 1
Dim jdx1 As Integer = NL + 1
Dim jdx2 As Integer = 1
For x As Integer = 1 To 1000
For k As Integer = 0 To (NA + 1) * (NL + 1) - 1 Step 2
Dim i As Integer = k \ (NL + 1)
Dim j As Integer = k - i * (NL + 1) + 1
i += 1
If Not (i = idx AndAlso (j = jdx1 OrElse j = jdx2)) Then V(i, j) = PDE(i, j)
Next
For k As Integer = 1 To (NA + 1) * (NL + 1) - 1 Step 2
Dim i As Integer = k \ (NL + 1)
Dim j As Integer = k - i * (NL + 1) + 1
i += 1
If Not (i = idx AndAlso (j = jdx1 OrElse j = jdx2)) Then V(i, j) = PDE(i, j)
Next
Next
Console.WriteLine("R = " & (1.0 / IV(idx, jdx1)).ToString)
Console.WriteLine("R = " & (-1.0 / IV(idx, jdx2)).ToString)
End Sub
End Module
R=33.0856844038614Ω
Chương trình trên cho thấy cách thiết lập các điện trở, dọc và ngang, cũng như ma trận điện áp, để nó đơn giản hóa một số thử nghiệm cho các nút không tồn tại và / hoặc giá trị điện trở. Mã này sạch hơn một chút, theo cách này, mặc dù nó đòi hỏi một số phần tử mảng nhiều hơn. (Tôi chỉ đơn giản là làm cho các giá trị điện trở phụ trở nên vô hạn về giá trị.) Chỉ cần so sánh cách tôi thiết lập các mảng với cách đặt sơ đồ, và tôi nghĩ bạn sẽ có thể tìm ra chính xác chi tiết tại đây.
Tất nhiên, tôi cũng đã hack các điện trở và giá trị nút, mà không thực hiện điều này theo bất kỳ cách nào một chương trình mục đích chung để đọc bảng giá trị. Nhưng sự chung chung đó là khá dễ dàng để thêm. Và mã này sẽ làm cho mọi thứ tôi viết hoàn toàn không rõ ràng.
xx
0V1V
(Được rồi. Thêm một lưu ý cuối cùng. Điều này sẽ được nhắm mục tiêu tốt hơn nhiều tại F # hoặc bất kỳ trình biên dịch tử tế nào nhắm vào hệ thống máy tính song song ồ ạt. Mỗi phép tính trong "đỏ" hoặc "đen" có thể được thực hiện song song, hoàn toàn độc lập với nhau. F # làm cho điều này trở nên tầm thường. Vì vậy, được mã hóa trong F #, bạn có thể chạy nó trên tất cả các lõi có sẵn của mình mà không có gì đặc biệt để làm. Nó chỉ hoạt động. Chỉ cần lưu ý trong trường hợp bạn đang thu thập RẤT NHIỀU dữ liệu theo cách nào đó và có thể muốn lấy lợi thế đầy đủ của một hệ thống đa lõi.)
LƯU Ý KẾT THÚC:
Đạo hàm khá đơn giản từ KCL. Đặt bốn điện trở vào sắp xếp sau:
mô phỏng mạch này - Sơ đồ được tạo bằng CircuitLab
Áp dụng KCL:
VR1+VR2+VR3+VR4V=V1R1+V2R2+V3R3+V4R4∴=(V1R1+V2R2+V3R3+V4R4)(R1∣∣R2∣∣R3∣∣R4)
Một số chơi xung quanh với đại số nhận được kết quả tôi đã sử dụng trong mã.