기본 아이디어는 매우 간단합니다. 시스템에서 "노드"또는 꼭짓점을 나타내는 행렬 ( )을 정렬 합니다. 이러한 각 노드에는 알고리즘이 진행됨에 따라 변경되거나 업데이트 될 수있는 스칼라 값 "전압"이 있습니다. 전압을 변경할 수없는 두 개의 노드도 있습니다. 여기서는 "배터리"를 적용 할 것이므로이 두 노드는이 배터리의 두 끝을 나타냅니다.V
별도로, 다른 두 행렬 ( 및 R h )은 시스템의 가로 및 세로 가장자리를 나타냅니다. 이것들은 당신의 저항 값입니다. 어떻게 작성하려고하는지 잘 모르겠습니다. 그러나 그것은 당신의 문제입니다. 이 기법은 이러한 행렬을 채울 수 있다고 가정합니다.R vR의 시간
사용하는 컴퓨터 언어에 따라 음수 인덱스를 사용하거나 사용하지 못할 수 있습니다. 중요하지 않습니다. 그것은 당신이 직면하고있는 것을 명심하는 것입니다.
길이 이 N L 섹션 으로 분할되고 "길이" A 가 N A 섹션 으로 분할 된다고 가정하자 . 그런 다음 스칼라 전압 값에 대해 ( N L + 1 ) ⋅ ( N A + 1 ) 정점 으로 행렬을 구성해야 합니다. 또한 N A ⋅ ( N L + 1 )의 수직 모서리와 N L ⋅ ( N A + 1의 다른 두 행렬도 필요합니다.엘엔엘ㅏ엔ㅏ( N엘+ 1 ) ⋅ ( Nㅏ+ 1 )엔ㅏ⋅ ( N엘+ 1 ) 그 정점 간의 수평 에지.엔엘⋅ ( Nㅏ+ 1 )
지금. 0으로 모든 정점을 초기화 . 왼쪽의 정점 중 하나를 선택하고 (가급적이면 중간에) 0으로 기록하십시오.0V절대로 변경할 수없는 V 값. 원하는 방법을 사용하십시오. 오른쪽의 정점 중 하나를 선택하고 (가급적이면 중간에) 값을 1로 변경하십시오.0V 는 다시 값을 변경할 수 없다는 점에 유의하십시오. 여기서 작동하는 기술은 단순히 정상적으로 변경되도록하고 각 단계마다 값을 바꾸는 것입니다. 그러나 당신이 그것을 달성하는 한, 당신이 이것을 달성하는 방법은 중요하지 않습니다.1V
(효율적인 이유로 다른 기술이 있지만 여기서는 귀찮게 할 가치가 없습니다.)
이제 바둑판 또는 적-검 색 알고리즘 이라고도하는 알고리즘이 있습니다. 노드 전압 매트릭스를 통해 이동하여 두 개의 인덱스, 이 짝수 인 각 노드를 처리 하여 다음과 같은 간단한 할당을 수행하십시오.나는 + 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)
위의 방정식은 4 개의 저항이 연결된 중앙 노드의 전압을 계산하는 것에 지나지 않으며 4 개의 저항의 다른 쪽 끝에있는 전압이 알려져 있습니다. 중앙 노드 전압은 위의 방정식으로부터 계산됩니다. 제수는 각 항에 대해 같으므로 분자의 합을 계산 한 다음 분모로 한 번 나눌 수 있습니다.
합계 가 고른 모든 노드가 업데이트됩니다 . 이제 합 i + j 가 홀수 인 모든 노드에 대해 동일한 절차를 수행합니다 . 이 두 단계가 모두 수행되면 한주기를 완료 한 것입니다.i+ji+j
필요한 경우 특수한 두 노드를 재설정하십시오 ( 와 10V또는 앞에서 설명한대로 V. ) 또는 두 노드를 보호 한 경우 재설정 할 필요가 없습니다.1V
다음 사이클을위한 준비가되었습니다. 전반적인 상태가 안정되는 데 필요한 횟수만큼이주기를 수행하십시오.
프로세스를 중지하면 왼쪽 보호 노드를 둘러싼 노드를 보거나 오른쪽 보호 노드를 둘러싼 노드를 보도록 선택하여 저항을 쉽게 해결할 수 있습니다. (어느 쪽을 선택하든 실제로 네 개의 노드를 갖도록 행렬을 [모든 방향으로 1 씩] 충분히 크게 만드는 것이 좋습니다.) 주변 노드와 특수 노드 사이의 전압 차이를 그들 사이의 가장자리에 저항은 당신에게 특별한 노드를 떠나거나 들어가는 전류를 알려줍니다. "배터리"노드이므로이 전류는 모두 전류 여야합니다. 전압이 1 이므로 는 정의에 따라 1을이 4 개의 전류의 합으로 나누면 총 저항을 나타냅니다.1V
나는 많은 주석과 함께 67 줄만이 작성한 코드를 쳐다보고있다. 따라서 쓰기가 어렵지 않습니다.
이 아이디어의 "짧은 요약"은 1 을 적용한다는 것입니다 배터리를 켠 다음 시스템 전체에 전압이 퍼지는 지 확인하십시오. 일단 전압이 안정되면 (그 기준), 하나의 배터리 단자 또는 다른 배터리 단자로 들어 오거나 나가는 전류를 살펴보기 만하면됩니다. 명백한 이유로 둘 다 동일한 현재 값이어야합니다 (일부 수치 범위 내).1V
왜 시스템을 i + j = 짝수와 i + j = 홀수로 분리해야합니까?
를 계산한다고 가정 해보십시오 . 이것은 V 5 , 5 를 둘러싸는 노드를 참조합니다 . 괜찮아. 다음에 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 . 매개 변수 목록에는V 5 , 5에 대해 방금 계산 한 값이있습니까? 이것은 많은 것들을 "얼룩"일 것입니다. 소리가 안납니다. 대신 홀수 / 짝수의 각주기는 같은 순간에 "있는 것처럼"나타납니다. 따라서 다음 계산은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)함수의 입력 없음 때문에 변경된 노드있는 동안 이 단계. 그런 다음 번갈아 가면서 번갈아 가면서 번갈아 가면서 번갈아 가며 업데이트하지 않습니다. 당신은 정말로 이런 식으로해야합니다.
또한 수식이 짝수 및 홀수 단계에 대해 동일합니까?
예, 동일합니다.
A가 선형 연산자이고 b가 경계 조건을 제공하는 일종의 선형 시스템 Ax = b를 사용하여 한 번에 모두 해결할 수 있습니까? 그것을 보면, 부분 미분 방정식을 푸는 유한 차분 법과 다소 유사 해 보입니다.
연결이 있습니다. 나는 그것이 매트릭스없는 구현이라고 불린다.
다음은 예입니다. 시뮬레이션을 위해 다음 저항 값 세트를 LTSpice에 배치했습니다.
나는 그것을 짧고 단순하게 유지했다. 보시다시피, 에서 대략의 계산 전류1V30.225엄마30.224552엄마
다음 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Ω
위의 프로그램은 전압 매트릭스뿐만 아니라 수직 및 수평 저항을 설정하는 방법을 보여 주어 존재하지 않는 노드 및 / 또는 저항 값에 대한 테스트를 단순화합니다. 배열 요소가 더 필요하지만 코드는 약간 깨끗합니다. (단순히 여분의 저항 값을 무한히 값으로 만들었습니다.) 회로도를 배치 한 방식으로 어레이를 설정 한 방법을 비교하면 모든 정확한 결과를 얻을 수 있다고 생각합니다. 자세한 내용은 여기입니다.
물론 저항 및 노드 값을 해킹하여이를 어떤 식 으로든 값 테이블을 읽는 범용 프로그램으로 만들지 않았습니다. 그러나 그 일반성은 추가하기가 매우 쉽습니다. 그리고이 코드는 내가 쓴 모든 것을 절대적으로 모호하게 만들어야합니다.
엑스엑스
그리고 마지막 메모. 고정 전압 노드의 전류를 사용하여 저항을 계산할 수 있음을 증명하기 위해 두 값을 인쇄하기 위해 두 줄을 사용했습니다. 하나는 에서 계산되었습니다.0V1V
(좋아요. 마지막으로 한 번 더 참고하십시오. F # 또는 대규모 병렬 컴퓨팅 시스템을 대상으로하는 괜찮은 컴파일러를 대상으로하는 것이 훨씬 낫습니다. "빨간색"또는 "검은 색"의 각 계산은 서로 독립적으로 병렬로 수행 할 수 있습니다. F #을 사용하면이 작업이 간단 해 지므로 F #으로 코딩하면 특별한 작업없이 사용 가능한 모든 코어에서이 작업을 실행할 수 있습니다. 어떻게 작동합니다. 많은 방식으로 많은 데이터를 수집 할 때 참고할 수 있습니다. 멀티 코어 시스템의 장점
종료 참고 :
파생은 KCL에서 매우 간단합니다. 다음 배열에 4 개의 저항을 배치하십시오.
이 회로 시뮬레이션 – CircuitLab을 사용하여 작성된 회로도
KCL 적용 :
V아르 자형1+ V아르 자형2+ V아르 자형삼+ V아르 자형4V= V1아르 자형1+ V2아르 자형2+ V삼아르 자형삼+ V4아르 자형4∴= ( V1아르 자형1+ V2아르 자형2+ V삼아르 자형삼+ V4아르 자형4) ( R1∣ ∣ R2∣ ∣ R삼∣ ∣ R4)
대수를 가지고 노는 일부는 코드에서 사용한 결과를 얻습니다.