V
RvRh
Kullandığınız bilgisayar diline bağlı olarak, negatif indeksler kullanabilir veya kullanamayabilirsiniz. Önemli değil. Bu sadece neyle karşı karşıya olduğunuzu akılda tutmaktır.
LNLANA(NL+1)⋅(NA+1)NA⋅(NL+1)NL⋅(NA+1)
Şimdi. Tüm köşeleri ile başlat0V0V1V
(Verimlilik nedenleriyle ilgili başka teknikler de var. Ama muhtemelen onlarla uğraşmaya değmez.)
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)
Yukarıdaki denklem, dört rezistörün diğer uçlarındaki voltajların bilindiği, ona bağlanan dört rezistöre sahip merkezi bir düğümün voltajını hesaplamaktan başka bir şey değildir. Merkezi düğüm gerilimi daha sonra yukarıdaki denklemden hesaplanır. Bölen her terim için aynı olduğundan, payların toplamını hesaplayabilir ve sonra bir kez payda tarafından bölebilirsiniz.
i+ji+j
0V1V
Bir sonraki döngü için hazırsınız. Bu döngüleri, genel durumun yerleşmesi için gerekli olduğunu düşündüğünüz kadar tekrarlayın (ve olacaktır.)
1V
Bazı kodlara bakıyorum, toplamlar, çok sayıda yorumla, sadece 67 satır yazdım. Yani yazmak zor değil.
1V
Neden sistemi i + j = even ve i + j = odd olarak ayırmanız gerekiyor?
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)çünkü işleve girişlerin hiçbiri bu adım sırasında değiştirilen düğümler değildir . Sonra, bulaşmayı önler ve şimdi alternatifleri güncelleyerek, alternatifleri hesaplarsınız. Gerçekten bu şekilde yapmak zorundasın.
Ayrıca, formül hem çift hem de tek adımlar için aynı mıdır?
Evet, aynı.
Hepsi bir tür lineer sistem kullanılarak tek bir adımda çözülebilir mi Ax = b burada A doğrusal bir operatördür ve b sınır koşullarını sağlar? Buna bakıldığında, kısmi diferansiyel denklemlerin çözümü için sonlu fark yöntemlerine biraz benziyor.
Bir bağlantı var. Bence buna 'matrissiz' uygulama deniyor.
İşte bir örnek. Simülasyon için LTSpice'e aşağıdaki direnç değerleri seti yerleştirildi:
1V30.225mA30.224552mA
Aşağıdaki VB.NET programını çalıştırdım:
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Ω
Yukarıdaki program, dikey ve yatay dirençlerin yanı sıra voltaj matrisinin kurulumunun bir yolunu gösterir, böylece mevcut olmayan düğümler ve / veya direnç değerleri için bazı testleri basitleştirir. Kod, bu şekilde biraz daha temiz, ancak daha fazla dizi öğesi gerektiriyor. (Basitçe ekstra direnç değerlerini sonsuz olarak yaptım.) Sadece dizileri nasıl yerleştirdiğimi şematikte ortaya konma şekliyle karşılaştırın ve bence tam olarak çalışabileceksiniz Ayrıntılar burada.
Ben de, herhangi bir şekilde bir değerler tablosunu okumak için genel amaçlı bir program yapmadan, dirençler ve düğüm değerlerinde hackledim. Ancak bu genelliği eklemek oldukça kolaydır. Ve bu kod yazdığım her şeyi kesinlikle açık hale getirmeli.
xx
Ve son bir not. Direnci hesaplamak için sabit voltaj düğümünün akımını kullanabileceğinizi kanıtlamak için, her iki değeri de yazdırmak için iki satır kullandım: biri hesaplandı0V1V
(Tamam. Son bir not daha. Bu F # ya da büyük ölçüde paralel bir hesaplama sistemini hedefleyen iyi bir derleyiciyi daha iyi hedefleyecektir. "Kırmızı" ya da "siyah" daki her hesaplama, birbirinden tamamen bağımsız olarak paralel olarak gerçekleştirilebilir. F # bunu önemsiz kılar F # ile kodlanmış, bunu yapmak için özel bir şey olmadan tüm mevcut çekirdeklerinizde çalıştırabilirsiniz. Sadece işe yarıyor.Bir miktar LOT veri toplamanız ve almak isteyebileceğiniz bir not çok çekirdekli bir sistemin tam avantajı.)
SON NOT:
KCL'den türetme oldukça basittir. Dört direnci aşağıdaki düzenlemeye yerleştirin:
bu devreyi simüle et - CircuitLab kullanılarak oluşturulan şematik
KCL uygula:
VR1+VR2+VR3+VR4V=V1R1+V2R2+V3R3+V4R4∴=(V1R1+V2R2+V3R3+V4R4)(R1∣∣R2∣∣R3∣∣R4)
Bazı cebir ile oynamak kodda kullanılan sonucu alır.