基本的な考え方はかなり単純です。システムの「ノード」または頂点を表すマトリックス()を配置します。これらの各ノードには、スカラー値の「電圧」が関連付けられており、アルゴリズムの進行に合わせて変更または更新できます。電圧を変更できない2つのノードもあります。ここで「バッテリー」の種類を適用するので、これらの2つのノードはこのバッテリーの両端を表します。V
別に、別の2つのマトリックス(およびR h)は、システムのエッジ(水平および垂直)を表します。これらはあなたの抵抗値です。これらをどのように記入するつもりなのかわかりません。しかし、それはあなたの問題です。この手法は、これらの行列も入力できることを前提としています。RvRh
使用するコンピューター言語に応じて、負のインデックスを使用できる場合とできない場合があります。関係ありません。それはあなたが直面していることを心に留めておくだけの問題です。
長さをN L 個のセクションに分割し、「長さ」AをN A 個のセクションに分割すると仮定します。次に、スカラー電圧値の(N L + 1 ) ⋅ (N A + 1 )頂点を持つ行列を作成する必要があります。(以上である。)また有するもの、他の二つの行列が必要になりますN A ⋅ (N L + 1 )垂直縁部及びN L ⋅ (N A + 1をLNLANA(NL+1)⋅(NA+1)NA⋅(NL+1)それらの頂点間の水平エッジ。NL⋅(NA+1)
今。すべての頂点を0で初期化し。左側(できれば中央)の頂点の1つを選択し、 0として記録します。0V絶対に変更できない V値。これにはどんな方法でも使用できます。右側(できれば中央)の頂点の1つを選択し、その値を 1に変更します。0V、その値は決して変更できないことに注意してください。ここで機能するテクニックは、通常どおりに変更するだけで、その後、すべてのステップで値を置き換えることです。しかし、それを達成する限り、これをどのように達成するかは問題ではありません。1V
(効率上の理由から他の手法もあります。しかし、ここでそれらを気にする価値はおそらくないでしょう。)
アルゴリズムについては、チェッカーボードまたは赤黒アルゴリズムとも呼ばれます。ノード電圧マトリックスを移動して、2つのインデックスの合計が偶数である各ノードを処理し、次の単純な割り当てを実行します。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)
上記の式は、4つの抵抗が接続された中央ノードの電圧を計算することに他なりません。4つの抵抗の他端の電圧は既知です。次に、中央ノード電圧が上記の式から計算されます。除数は各項で同じであるため、分子の合計を計算し、分母で一度除算できます。
これにより、合計が偶数であるすべてのノードが更新されます。ここで、合計i + jが奇数であるすべてのノードに対して同じ手順を実行します。これらの手順が両方とも実行されると、1サイクルが完了します。i+ji+j
必要に応じて、特別な2つのノードをリセットします(および 10V前に説明したように V。または、これらの2つのノードを保護した場合、それらをリセットする必要はありません。1V
次のサイクルの準備ができました。これらのサイクルは、全体的な状態が落ち着くために必要であると感じる回数だけ実行します(そうするでしょう)。
プロセスを停止すると、左側の保護されたノードを囲むノードを見るか、右側の保護されたノードを囲むノードを見るかを選択することで、抵抗を簡単に解決できます。(マトリックスを十分な大きさ(すべての方向で1だけ)大きくして、どちらかの選択肢を実際に4つのノードで囲むことをお勧めします。)周囲のノードと特別なノード間の電圧の差をそれらの間のエッジの抵抗は、現在の特別なノードの出入りを示します。これは「バッテリー」ノードであるため、この電流は電流のすべてでなければなりません。電圧がは、定義上、1をこれらの4つの電流の合計で割ることにより、合計抵抗を示します。1V
合計67行だけのコメントをたくさん書いたコードを見つめています。書くのは難しくありません。
このアイデアの「短い要約」は、あなたが適用することですバッテリーを Vにして、電圧がシステム全体に広がるのを観察します。電圧が安定したら(そのための基準)、やらなければならないことは、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を使用して、すべてを1ステップで解決できますか?それを見ると、偏微分方程式を解くための有限差分法にやや似ているように見えます。
接続があります。「マトリックスフリー」実装と呼ばれると思います。
以下に例を示します。次の抵抗値のセットは、シミュレーションのために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Ω
上記のプログラムは、存在しないノードおよび/または抵抗値のテストの一部を簡素化するために、抵抗、垂直および水平、ならびに電圧マトリックスを設定する方法を示しています。この方法では、コードは少しきれいになりますが、配列要素がさらに必要になります。(単に追加の抵抗値を無限にしただけです。)アレイのセットアップ方法と回路図のレイアウト方法を比較するだけで、すべての正確な値を計算できると思います。詳細はこちら。
もちろん、抵抗値とノード値もハッキングしましたが、これを何らかの方法で値のテーブルを読み取るための汎用プログラムにすることはしませんでした。しかし、その一般性は簡単に追加できます。そして、このコードは、私が書いたすべてを完全に明確にする必要があります。
バツバツ
0V1V
(わかりました。もう1つ注意してください。これは、F#または大規模並列コンピューティングシステムを対象とする適切なコンパイラをターゲットとする方がはるかに優れています。 F#はこれを簡単にします。F#でコーディングされているので、利用可能なすべてのコアで特別なことをせずに実行できます。それは機能します。何らかの方法で大量のデータを収集し、マルチコアシステムの完全な利点。)
エンドノート:
KCLからの派生は非常に簡単です。4つの抵抗を次の配置に配置します。
この回路のシミュレーション – CircuitLabを使用して作成された回路図
KCLを適用します。
VR1+ VR2+ VR3+ VR4V= V1R1+ V2R2+ V3R3+ V4R4∴= (V1R1+ V2R2+ V3R3+ V4R4)( R1∣ ∣ R2∣ ∣ R3∣ ∣ R4)
代数で遊んでいる人は、コードで使用した結果を取得します。