V
RvRh
Залежно від мови комп'ютера, яку ви використовуєте, ви можете або не можете використовувати негативні індекси. Не має значення. Це лише питання пам’ятати, з чим ти стикаєшся.
LNLANA(NL+1)⋅(NA+1)NA⋅(NL+1)NL⋅(NA+1)
0V0V1V
(Існують інші методи з міркувань ефективності. Але, мабуть, тут не варто заважати.)
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)
Вищенаведене рівняння - це не що інше, як обчислення напруги центрального вузла, що має до нього чотири резистори, де напруги на інших кінцях чотирьох резисторів відомі. Потім напруга центрального вузла обчислюється з наведеного рівняння. Оскільки дільник однаковий для кожного члена, ви можете просто обчислити суму чисельників, а потім розділити один раз на знаменник.
i+ji+j
0V1V
Ви готові до наступного циклу. Виконайте ці цикли стільки разів, скільки, як вам здається, потрібно, щоб загальний стан встиг (і це буде.)
1V
Я дивлюсь на якийсь код, який я написав, що всього, з великою кількістю коментарів, всього 67 рядків. Тож НЕ важко писати.
1V
Чому ви повинні розділити систему на i + j = парне і i + j = непарне?
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)оскільки жоден з входів у функцію не є вузлами, які були змінені під час цього кроку. Потім ви розгойдуєтесь та обчислюєте альтернативи, уникаючи розмиття, але тепер оновляєте альтернативи. Ви дійсно повинні робити це так.
Також, чи однакова формула як для парних, так і для непарних кроків?
Так, це те саме.
Чи можна все це вирішити за один крок, використовуючи якусь лінійну систему Ax = b, де A - лінійний оператор, а b забезпечує граничні умови? Дивлячись на це, здається дещо аналогічним методам кінцевих різниць для вирішення часткових диференціальних рівнянь ..
Є зв’язок. Я думаю, це називається реалізацією без матриць.
Ось приклад. Наступний набір значень резисторів було розміщено в LTSpice для моделювання:
1V30.225mA30.224552mA
Я запустив таку програму 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Ω
Вищенаведена програма показує спосіб встановлення резисторів, вертикальних і горизонтальних, а також матрицю напруги, щоб вона спростила деякі тести на неіснуючі вузли та / або значення резисторів. Код таким чином трохи чистіший, хоча для цього потрібні ще деякі елементи масиву. (Я просто зробив додаткові значення резистора нескінченними.) Просто порівняйте, як я налаштував масиви з тим, як була викладена схема, і я думаю, ви зможете все точно розробити подробиці тут.
Я, звичайно, також зламав резистори та значення вузлів, не роблячи це жодним чином загальною програмою для читання таблиці значень. Але цю загальність додати досить просто. І цей код повинен зробити все, що я написав, абсолютно однозначним.
xx
0V1V
(Гаразд. Ще одне заключне зауваження. Це було б набагато краще орієнтуватися на F # або будь-який пристойний компілятор, орієнтований на масово паралельну обчислювальну систему. Кожен обчислення в "червоному" або "чорному" кольорі можна проводити паралельно; повністю незалежно один від одного. F # робить це дрібницею. Отже, зашифрований у F #, ви можете запустити це на всіх наявних у вас ядрах, не роблячи нічого особливого. Це просто працює. Просто зауважте, якщо ви збираєте багато даних якимись способами і, можливо, захочете взяти повна перевага багатоядерної системи.)
ПРИМІТКА ЗАКОНЧА
Виведення є досить простим від KCL. Розмістіть чотири резистори в наступному розташуванні:
імітувати цю схему - Схематично створено за допомогою CircuitLab
Застосувати KCL:
VR1+VR2+VR3+VR4V=V1R1+V2R2+V3R3+V4R4∴=(V1R1+V2R2+V3R3+V4R4)(R1∣∣R2∣∣R3∣∣R4)
Деякі гравці з алгеброю отримують результат, який я використав у коді.