유한 저항 그리드의 유효 저항을 어떻게 결정합니까? 상에 1 내지 24로 라벨링 된 관련

면책 조항 : 저는 제한된 전기 공학 배경을 가진 지구 물리학 자입니다. 이 문제가 엄청나게 쉬운 지, 엄청나게 복잡한 지, 또는 완전히 무의미한 지 잘 모르겠습니다.

내 목표 : 저항 네트워크를 사용하여 암석 샘플의 벌크 저항을 결정합니다.

암석 샘플은 저항이 높은 특정 저항 (고체 암석을 나타냄)과 저항이 낮은 저항 (암석의 유체 경로를 나타냄)이있는 저항 네트워크를 사용하여 모델링해야합니다.

아래와 같이 균일 한 그리드에 저항기 네트워크가 있다고 가정합니다. 도시 된 예에서, 각 라인 세그먼트는 3×3 그리드 상에 1 내지 24로 라벨링 된 관련 저항을 갖는다. 각 선분의 저항이 알려져 있습니다.

그리드의 총 길이는 이고 “영역”은 (이 경우 2D 예이므로 면적도 길이 임). 샘플의 벌크 저항은 다음과 같이 주어진다 :

ρ케이=아르 자형이자형에프에프

여기에 이미지 설명을 입력하십시오

내 질문 : 네트워크 의 유효 저항 을 어떻게 결정 합니까?

아르 자형이자형에프에프

나는 온라인을 보았지만 무한 네트워크, 소스 및 싱크 전류 등에 대한 토론 만 찾을 수 있습니다 . 나는 전류 또는 전압에 관심이 없습니다.

이 문제를 그대로 해결할 수 있습니까?



답변

기본 아이디어는 매우 간단합니다. 시스템에서 “노드”또는 꼭짓점을 나타내는 행렬 ( )을 정렬 합니다. 이러한 각 노드에는 알고리즘이 진행됨에 따라 변경되거나 업데이트 될 수있는 스칼라 값 “전압”이 있습니다. 전압을 변경할 수없는 두 개의 노드도 있습니다. 여기서는 “배터리”를 적용 할 것이므로이 두 노드는이 배터리의 두 끝을 나타냅니다.

V

별도로, 다른 두 행렬 ( R h )은 시스템의 가로 및 세로 가장자리를 나타냅니다. 이것들은 당신의 저항 값입니다. 어떻게 작성하려고하는지 잘 모르겠습니다. 그러나 그것은 당신의 문제입니다. 이 기법은 이러한 행렬을 채울 수 있다고 가정합니다.

아르 자형V

아르 자형h

사용하는 컴퓨터 언어에 따라 음수 인덱스를 사용하거나 사용하지 못할 수 있습니다. 중요하지 않습니다. 그것은 당신이 직면하고있는 것을 명심하는 것입니다.

길이 N L 섹션 으로 분할되고 “길이” AN A 섹션 으로 분할 된다고 가정하자 . 그런 다음 스칼라 전압 값에 대해 ( N L + 1 )( N A + 1 ) 정점 으로 행렬을 구성해야 합니다. 또한 N A( N L + 1 )의 수직 모서리와 N L( N A + 1의 다른 두 행렬도 필요합니다.

(+1)(+1)

(+1)

그 정점 간의 수평 에지.

(+1)

지금. 0으로 모든 정점을 초기화 . 왼쪽의 정점 중 하나를 선택하고 (가급적이면 중간에) 0으로 기록하십시오.

0V

절대로 변경할 수없는 V 값. 원하는 방법을 사용하십시오. 오른쪽의 정점 중 하나를 선택하고 (가급적이면 중간에) 값을 1로 변경하십시오.

0V

는 다시 값을 변경할 수 없다는 점에 유의하십시오. 여기서 작동하는 기술은 단순히 정상적으로 변경되도록하고 각 단계마다 값을 바꾸는 것입니다. 그러나 당신이 그것을 달성하는 한, 당신이 이것을 달성하는 방법은 중요하지 않습니다.

1V

(효율적인 이유로 다른 기술이 있지만 여기서는 귀찮게 할 가치가 없습니다.)

이제 바둑판 또는 적-검 색 알고리즘 이라고도하는 알고리즘이 있습니다. 노드 전압 매트릭스를 통해 이동하여 두 개의 인덱스, 이 짝수 인 각 노드를 처리 하여 다음과 같은 간단한 할당을 수행하십시오.

나는+제이

Vi,j=Rhi,j1Rhi,j(Vi1,jRvi,j+Vi+1,jRvi1,j)Rhi,j1Rhi,j(Rvi,j+Rvi1,j)+Rvi1,jRvi,j(Rhi,j+Rhi,j1)+Rvi1,jRvi,j(Vi,j1Rhi,j+Vi,j+1Rhi,j1)Rhi,j1Rhi,j(Rvi,j+Rvi1,j)+Rvi1,jRvi,j(Rhi,j+Rhi,j1)

위의 방정식은 4 개의 저항이 연결된 중앙 노드의 전압을 계산하는 것에 지나지 않으며 4 개의 저항의 다른 쪽 끝에있는 전압이 알려져 있습니다. 중앙 노드 전압은 위의 방정식으로부터 계산됩니다. 제수는 각 항에 대해 같으므로 분자의 합을 계산 한 다음 분모로 한 번 나눌 수 있습니다.

합계 가 고른 모든 노드가 업데이트됩니다 . 이제 합 i + j 가 홀수 인 모든 노드에 대해 동일한 절차를 수행합니다 . 이 두 단계가 모두 수행되면 한주기를 완료 한 것입니다.

i+j

i+j

필요한 경우 특수한 두 노드를 재설정하십시오 ( 1

0V

또는 앞에서 설명한대로 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=에프(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=에프(V4,6,V6,6,V5,5,V5,7)

V5,5

V5,7=에프(V4,7,V6,7,V5,6,V5,8)

함수의 입력 없음 때문에 변경된 노드있는 동안 이 단계. 그런 다음 번갈아 가면서 번갈아 가면서 번갈아 가면서 번갈아 가며 업데이트하지 않습니다. 당신은 정말로 이런 식으로해야합니다.

또한 수식이 짝수 및 홀수 단계에 대해 동일합니까?

예, 동일합니다.

A가 선형 연산자이고 b가 경계 조건을 제공하는 일종의 선형 시스템 Ax = b를 사용하여 한 번에 모두 해결할 수 있습니까? 그것을 보면, 부분 미분 방정식을 푸는 유한 차분 법과 다소 유사 해 보입니다.

연결이 있습니다. 나는 그것이 매트릭스없는 구현이라고 불린다.


다음은 예입니다. 시뮬레이션을 위해 다음 저항 값 세트를 LTSpice에 배치했습니다.

여기에 이미지 설명을 입력하십시오

나는 그것을 짧고 단순하게 유지했다. 보시다시피, 에서 대략의 계산 전류

1V

30.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

아르 자형=33.0856844038614Ω

위의 프로그램은 전압 매트릭스뿐만 아니라 수직 및 수평 저항을 설정하는 방법을 보여 주어 존재하지 않는 노드 및 / 또는 저항 값에 대한 테스트를 단순화합니다. 배열 요소가 더 필요하지만 코드는 약간 깨끗합니다. (단순히 여분의 저항 값을 무한히 값으로 만들었습니다.) 회로도를 배치 한 방식으로 어레이를 설정 한 방법을 비교하면 모든 정확한 결과를 얻을 수 있다고 생각합니다. 자세한 내용은 여기입니다.

물론 저항 및 노드 값을 해킹하여이를 어떤 식 으로든 값 테이블을 읽는 범용 프로그램으로 만들지 않았습니다. 그러나 그 일반성은 추가하기가 매우 쉽습니다. 그리고이 코드는 내가 쓴 모든 것을 절대적으로 모호하게 만들어야합니다.

엑스

엑스

그리고 마지막 메모. 고정 전압 노드의 전류를 사용하여 저항을 계산할 수 있음을 증명하기 위해 두 값을 인쇄하기 위해 두 줄을 사용했습니다. 하나는 에서 계산되었습니다.

0V

1V

(좋아요. 마지막으로 한 번 더 참고하십시오. F # 또는 대규모 병렬 컴퓨팅 시스템을 대상으로하는 괜찮은 컴파일러를 대상으로하는 것이 훨씬 낫습니다. “빨간색”또는 “검은 색”의 각 계산은 서로 독립적으로 병렬로 수행 할 수 있습니다. F #을 사용하면이 작업이 간단 해 지므로 F #으로 코딩하면 특별한 작업없이 사용 가능한 모든 코어에서이 작업을 실행할 수 있습니다. 어떻게 작동합니다. 많은 방식으로 많은 데이터를 수집 할 때 참고할 수 있습니다. 멀티 코어 시스템의 장점


종료 참고 :

파생은 KCL에서 매우 간단합니다. 다음 배열에 4 개의 저항을 배치하십시오.

개략도

이 회로 시뮬레이션CircuitLab을 사용하여 작성된 회로도

KCL 적용 :

V아르 자형1+V아르 자형2+V아르 자형+V아르 자형4=V1아르 자형1+V2아르 자형2+V아르 자형+V4아르 자형4V=(V1아르 자형1+V2아르 자형2+V아르 자형+V4아르 자형4)(아르 자형1∣∣아르 자형2∣∣아르 자형∣∣아르 자형4)

대수를 가지고 노는 일부는 코드에서 사용한 결과를 얻습니다.


답변

2D 저항기 네트워크를 사용하여 2D 문제를 모델링 할 수는 있지만 3 차원으로 이동할 때 다소 까다로울 수 있습니다. 적절한 전도도가 지정된 도메인에 정의 된 체적 전도체와 함께보다 전통적인 (현재) 접근 방식을 사용하는 것이 좋습니다. FEMM 프리웨어 코드 ( http://www.femm.info/wiki/HomePage )는 매우 유능하며 2D, 축 대칭 및 3D에 사용할 수 있습니다. 거기에서 SCIrun ( https://www.sci.utah.edu/ 와 같은 훨씬 더 유능한 코드로 이동하는 것을 고려할 수 있습니다이는 상당히 복잡한 볼륨 도체 문제에 대한 학술 코드입니다. 백만 개 이상의 사면체 메쉬에 일상적으로 사용합니다. 비록 생물학적 모델링을 위해 주로 개발되었지만, 당신이하고있는 일에 아주 효과적입니다. 정방향 / 역방향 툴킷의 정방향 문제의 예는 당신을 도울 것입니다. 임피던스 단층 촬영에 유용한 역 문제도 발견 할 수 있습니다. 버전 5는 여전히 진행중인 작업이므로 일반적으로 버전 4를 사용합니다. 이 소프트웨어는 또한 훌륭한 메쉬 빌드 코드 인 tetgen에 대한 인터페이스를 가지고 있습니다.

마지막으로, 돈을 쓰는 것에 반대하지 않으면 COMSOL이 항상 사용하기 쉽고 매우 비쌉니다.


답변