면책 조항 : 저는 제한된 전기 공학 배경을 가진 지구 물리학 자입니다. 이 문제가 엄청나게 쉬운 지, 엄청나게 복잡한 지, 또는 완전히 무의미한 지 잘 모르겠습니다.
내 목표 : 저항 네트워크를 사용하여 암석 샘플의 벌크 저항을 결정합니다.
암석 샘플은 저항이 높은 특정 저항 (고체 암석을 나타냄)과 저항이 낮은 저항 (암석의 유체 경로를 나타냄)이있는 저항 네트워크를 사용하여 모델링해야합니다.
아래와 같이 균일 한 그리드에 저항기 네트워크가 있다고 가정합니다. 도시 된 예에서, 각 라인 세그먼트는 3×3 그리드 상에 1 내지 24로 라벨링 된 관련 저항을 갖는다. 각 선분의 저항이 알려져 있습니다.
그리드의 총 길이는 이고 “영역”은 (이 경우 2D 예이므로 면적도 길이 임). 샘플의 벌크 저항은 다음과 같이 주어진다 :
엘ㅏ
내 질문 : 네트워크 의 유효 저항 을 어떻게 결정 합니까?
아르 자형이자형에프에프나는 온라인을 보았지만 무한 네트워크, 소스 및 싱크 전류 등에 대한 토론 만 찾을 수 있습니다 . 나는 전류 또는 전압에 관심이 없습니다.
이 문제를 그대로 해결할 수 있습니까?
답변
기본 아이디어는 매우 간단합니다. 시스템에서 “노드”또는 꼭짓점을 나타내는 행렬 ( )을 정렬 합니다. 이러한 각 노드에는 알고리즘이 진행됨에 따라 변경되거나 업데이트 될 수있는 스칼라 값 “전압”이 있습니다. 전압을 변경할 수없는 두 개의 노드도 있습니다. 여기서는 “배터리”를 적용 할 것이므로이 두 노드는이 배터리의 두 끝을 나타냅니다.
V별도로, 다른 두 행렬 ( 및 R h )은 시스템의 가로 및 세로 가장자리를 나타냅니다. 이것들은 당신의 저항 값입니다. 어떻게 작성하려고하는지 잘 모르겠습니다. 그러나 그것은 당신의 문제입니다. 이 기법은 이러한 행렬을 채울 수 있다고 가정합니다.
아르 자형V아르 자형h
사용하는 컴퓨터 언어에 따라 음수 인덱스를 사용하거나 사용하지 못할 수 있습니다. 중요하지 않습니다. 그것은 당신이 직면하고있는 것을 명심하는 것입니다.
길이 이 N L 섹션 으로 분할되고 “길이” A 가 N 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(효율적인 이유로 다른 기술이 있지만 여기서는 귀찮게 할 가치가 없습니다.)
이제 바둑판 또는 적-검 색 알고리즘 이라고도하는 알고리즘이 있습니다. 노드 전압 매트릭스를 통해 이동하여 두 개의 인덱스, 이 짝수 인 각 노드를 처리 하여 다음과 같은 간단한 할당을 수행하십시오.
나는+제이
위의 방정식은 4 개의 저항이 연결된 중앙 노드의 전압을 계산하는 것에 지나지 않으며 4 개의 저항의 다른 쪽 끝에있는 전압이 알려져 있습니다. 중앙 노드 전압은 위의 방정식으로부터 계산됩니다. 제수는 각 항에 대해 같으므로 분자의 합을 계산 한 다음 분모로 한 번 나눌 수 있습니다.
합계 가 고른 모든 노드가 업데이트됩니다 . 이제 합 i + j 가 홀수 인 모든 노드에 대해 동일한 절차를 수행합니다 . 이 두 단계가 모두 수행되면 한주기를 완료 한 것입니다.
i+ji+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에 배치했습니다.
나는 그것을 짧고 단순하게 유지했다. 보시다시피, 에서 대략의 계산 전류
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
아르 자형=33.0856844038614Ω
위의 프로그램은 전압 매트릭스뿐만 아니라 수직 및 수평 저항을 설정하는 방법을 보여 주어 존재하지 않는 노드 및 / 또는 저항 값에 대한 테스트를 단순화합니다. 배열 요소가 더 필요하지만 코드는 약간 깨끗합니다. (단순히 여분의 저항 값을 무한히 값으로 만들었습니다.) 회로도를 배치 한 방식으로 어레이를 설정 한 방법을 비교하면 모든 정확한 결과를 얻을 수 있다고 생각합니다. 자세한 내용은 여기입니다.
물론 저항 및 노드 값을 해킹하여이를 어떤 식 으로든 값 테이블을 읽는 범용 프로그램으로 만들지 않았습니다. 그러나 그 일반성은 추가하기가 매우 쉽습니다. 그리고이 코드는 내가 쓴 모든 것을 절대적으로 모호하게 만들어야합니다.
엑스
엑스
그리고 마지막 메모. 고정 전압 노드의 전류를 사용하여 저항을 계산할 수 있음을 증명하기 위해 두 값을 인쇄하기 위해 두 줄을 사용했습니다. 하나는 에서 계산되었습니다.
0V1V
(좋아요. 마지막으로 한 번 더 참고하십시오. F # 또는 대규모 병렬 컴퓨팅 시스템을 대상으로하는 괜찮은 컴파일러를 대상으로하는 것이 훨씬 낫습니다. “빨간색”또는 “검은 색”의 각 계산은 서로 독립적으로 병렬로 수행 할 수 있습니다. F #을 사용하면이 작업이 간단 해 지므로 F #으로 코딩하면 특별한 작업없이 사용 가능한 모든 코어에서이 작업을 실행할 수 있습니다. 어떻게 작동합니다. 많은 방식으로 많은 데이터를 수집 할 때 참고할 수 있습니다. 멀티 코어 시스템의 장점
종료 참고 :
파생은 KCL에서 매우 간단합니다. 다음 배열에 4 개의 저항을 배치하십시오.
이 회로 시뮬레이션 – CircuitLab을 사용하여 작성된 회로도
KCL 적용 :
대수를 가지고 노는 일부는 코드에서 사용한 결과를 얻습니다.
답변
2D 저항기 네트워크를 사용하여 2D 문제를 모델링 할 수는 있지만 3 차원으로 이동할 때 다소 까다로울 수 있습니다. 적절한 전도도가 지정된 도메인에 정의 된 체적 전도체와 함께보다 전통적인 (현재) 접근 방식을 사용하는 것이 좋습니다. FEMM 프리웨어 코드 ( http://www.femm.info/wiki/HomePage )는 매우 유능하며 2D, 축 대칭 및 3D에 사용할 수 있습니다. 거기에서 SCIrun ( https://www.sci.utah.edu/ 와 같은 훨씬 더 유능한 코드로 이동하는 것을 고려할 수 있습니다이는 상당히 복잡한 볼륨 도체 문제에 대한 학술 코드입니다. 백만 개 이상의 사면체 메쉬에 일상적으로 사용합니다. 비록 생물학적 모델링을 위해 주로 개발되었지만, 당신이하고있는 일에 아주 효과적입니다. 정방향 / 역방향 툴킷의 정방향 문제의 예는 당신을 도울 것입니다. 임피던스 단층 촬영에 유용한 역 문제도 발견 할 수 있습니다. 버전 5는 여전히 진행중인 작업이므로 일반적으로 버전 4를 사용합니다. 이 소프트웨어는 또한 훌륭한 메쉬 빌드 코드 인 tetgen에 대한 인터페이스를 가지고 있습니다.
마지막으로, 돈을 쓰는 것에 반대하지 않으면 COMSOL이 항상 사용하기 쉽고 매우 비쌉니다.