V
RvRh
W zależności od używanego języka komputerowego możesz, ale nie musi, używać ujemnych wskaźników. Nie ma znaczenia To tylko kwestia zapamiętania tego, z czym masz do czynienia.
LNLANA(NL+1)⋅(NA+1)NA⋅(NL+1)NL⋅(NA+1)
0V0V1V
(Istnieją inne techniki ze względu na wydajność. Ale prawdopodobnie nie warto się nimi przejmować.)
i+j
Vi,j=Rhi,j−1⋅Rhi,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)
Powyższe równanie jest niczym innym jak obliczeniem napięcia węzła centralnego mającego cztery połączone z nim rezystory, gdzie znane są napięcia na pozostałych końcach czterech oporników. Napięcie węzła centralnego jest następnie obliczane na podstawie powyższego równania. Ponieważ dzielnik jest taki sam dla każdego terminu, możesz po prostu obliczyć sumę liczników, a następnie podzielić raz przez mianownik.
i+ji+j
0V1V
Jesteś gotowy na następny cykl. Wykonuj te cykle tyle razy, ile uważasz, że jest to konieczne, aby ogólny stan się uspokoił (i tak się stanie).
1V
Patrzę na kod, który napisałem, z wieloma komentarzami, tylko 67 wierszy. Więc NIE jest trudno pisać.
1V
Dlaczego musisz podzielić system na i + j = parzysty i i + j = nieparzysty?
V5,5=f(V4,5,V6,5,V5,4,V5,6)V5,5V5,6=f(V4,6,V6,6,V5,5,V5,7)V5,5V5,7=f(V4,7,V6,7,V5,6,V5,8)ponieważ żadne z danych wejściowych funkcji nie są węzłami zmienionymi podczas tego kroku. Następnie obracasz się i obliczasz alternatywy, unikając rozmazywania, ale teraz aktualizujesz alternatywy. Naprawdę musisz to zrobić w ten sposób.
Ponadto, czy formuła jest identyczna dla kroków parzystych i nieparzystych?
Tak, to jest to samo.
Czy wszystko można rozwiązać w jednym kroku za pomocą pewnego rodzaju systemu liniowego Ax = b, gdzie A jest operatorem liniowym, a b zapewnia warunki brzegowe? Patrząc na to, wydaje się nieco analogiczne do metod różnic skończonych do rozwiązywania równań różniczkowych cząstkowych.
Istnieje połączenie. Myślę, że nazywa się to implementacją „bez matrycy”.
Oto przykład. Następujący zestaw wartości rezystorów został umieszczony w LTSpice do symulacji:
1V30.225mA30.224552mA
Uruchomiłem następujący program VB.NET:
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Ω
Powyższy program pokazuje sposób ustawiania rezystorów, pionowego i poziomego, a także macierzy napięcia, dzięki czemu upraszcza niektóre testy nieistniejących węzłów i / lub wartości rezystorów. W ten sposób kod jest nieco bardziej przejrzysty, choć wymaga jeszcze kilku elementów tablicy. (Po prostu sprawiłem, że dodatkowe wartości rezystorów mają nieskończoną wartość.) Po prostu porównaj, jak skonfigurowałem tablice, ze schematem, a także, i myślę, że będziesz w stanie wypracować dokładne szczegóły tutaj.
Oczywiście włamałem się również do rezystorów i wartości węzłów, nie czyniąc z tego programu ogólnego przeznaczenia do odczytywania tabeli wartości. Ale tę ogólność można dość łatwo dodać. I ten kod powinien uczynić wszystko, co napisałem, absolutnie jednoznaczne.
xx
0V1V
(Dobra. Jeszcze jedna uwaga końcowa. Byłoby to znacznie lepiej ukierunkowane na F # lub dowolny porządny kompilator ukierunkowany na masowo równoległy system obliczeniowy. Każde obliczenie w „czerwonym” lub „czarnym” można wykonać równolegle, całkowicie niezależnie od siebie. F # sprawia, że jest to trywialne. Więc zakodowane w F #, możesz uruchomić to na wszystkich dostępnych rdzeniach bez żadnych specjalnych czynności. To po prostu działa. Tylko uwaga na wypadek, gdybyś zbierał dużo danych w jakiś sposób i chciałbyś wziąć pełna korzyść systemu wielordzeniowego.)
UWAGA KOŃCOWA:
Wyprowadzenie jest dość proste z KCL. Umieść cztery rezystory w następującym układzie:
symulacja tego obwodu - Schemat utworzony przy użyciu CircuitLab
Zastosuj KCL:
VR1+VR2+VR3+VR4V=V1R1+V2R2+V3R3+V4R4∴=(V1R1+V2R2+V3R3+V4R4)(R1∣∣R2∣∣R3∣∣R4)
Niektórzy bawiąc się algebrą uzyskują wynik, którego użyłem w kodzie.