แนวคิดพื้นฐานนั้นค่อนข้างง่าย คุณจัดเรียงเมทริกซ์ ( ) ที่แสดงถึง "โหนด" หรือจุดยอดในระบบของคุณ แต่ละโหนดเหล่านี้มี "แรงดันไฟฟ้า" ที่เกี่ยวข้องกับสเกลาร์ซึ่งสามารถเปลี่ยนแปลงหรือปรับปรุงได้เมื่ออัลกอริทึมดำเนินการ จะมีสองโหนดที่ไม่สามารถเปลี่ยนแรงดันไฟฟ้าได้ เราจะใช้ "แบตเตอรี" ของแปลก ๆ ที่นี่ดังนั้นทั้งสองโหนดจึงเป็นตัวแทนของทั้งสองด้านของแบตเตอรี่นี้V
แยกจากกันเมทริกซ์อีกสองตัว (และ ) แสดงถึงขอบในระบบแนวนอนและแนวตั้ง นี่คือค่าความต้านทานของคุณฉันเดา ฉันไม่แน่ใจว่าคุณตั้งใจเติมสิ่งเหล่านี้อย่างไร แต่นั่นเป็นปัญหาของคุณ เทคนิคนี้สมมติว่าคุณสามารถเติมเมทริกซ์เหล่านี้ได้เช่นกันR hRvRh
คุณอาจใช้หรือไม่สามารถใช้ดัชนีลบได้ทั้งนี้ขึ้นอยู่กับภาษาคอมพิวเตอร์ที่คุณใช้ ไม่เป็นไร เป็นเพียงเรื่องของการคำนึงถึงสิ่งที่คุณกำลังเผชิญกับ
สมมติว่าความยาวแบ่งออกเป็นส่วนและ "ความยาว"แบ่งออกเป็นส่วนจากนั้นคุณจะต้องสร้างเมทริกซ์ด้วยจุดยอดสำหรับค่าแรงดันสเกลาร์ (หรือใหญ่กว่า) คุณจะต้องเมทริกซ์อีกสองตัวที่มีขอบแนวตั้งและขอบแนวนอนระหว่างจุดยอดเหล่านั้น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)
ตอนนี้ เริ่มต้นทุกจุดที่มี{V} เลือกหนึ่งในจุดยอดทางด้านซ้าย (ตรงกลาง, เด่นกว่า) และบันทึกเป็นค่าที่ไม่ได้รับอนุญาตให้เปลี่ยนแปลง ใช้วิธีใดก็ได้ที่คุณต้องการสำหรับสิ่งนี้ เลือกหนึ่งในจุดยอดทางด้านขวา (ตรงกลาง, เด่นกว่า) และเปลี่ยนค่าเป็น , ในขณะที่รับทราบอีกครั้งว่าไม่อนุญาตให้เปลี่ยนแปลงค่าของมัน เทคนิคที่ใช้งานได้ที่นี่คือการปล่อยให้มันเปลี่ยนตามปกติแล้วแทนที่ค่าในแต่ละขั้นตอน แต่มันไม่สำคัญว่าคุณจะประสบความสำเร็จได้อย่างไรตราบใดที่คุณประสบความสำเร็จ 00V 10V1V
(มีเทคนิคอื่น ๆ สำหรับเหตุผลด้านประสิทธิภาพ แต่อาจไม่คุ้มกับปัญหาที่นี่)
ตอนนี้สำหรับขั้นตอนวิธีการซึ่งบางครั้งเรียกว่าหมากรุกหรือสีแดงสีดำอัลกอริทึม การเคลื่อนที่ผ่านเมทริกซ์แรงดันโหนดของคุณประมวลผลแต่ละโหนดที่ผลรวมของสองดัชนีเป็นคู่โดยทำการมอบหมายอย่างง่าย ๆ ดังต่อไปนี้: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
คุณพร้อมสำหรับรอบต่อไป ทำรอบเหล่านี้หลาย ๆ ครั้งตามที่คุณรู้สึกว่าจำเป็นสำหรับสถานะโดยรวมในการปักหลัก (และจะ)
เมื่อคุณหยุดกระบวนการคุณสามารถหาค่าความต้านทานได้อย่างง่ายดายโดยเลือกดูที่โหนดที่อยู่รอบ ๆ โหนดที่ได้รับการป้องกันทางด้านซ้าย (อาจเป็นความคิดที่ดีที่จะทำให้เมทริกซ์ของคุณมีขนาดใหญ่พอ [โดย 1 ในทุกทิศทาง] เพื่อที่คุณจะได้มีสี่โหนดรอบ ๆ ตัวเลือก) ความแตกต่างของแรงดันไฟฟ้าระหว่างโหนดโดยรอบและโหนดพิเศษหารด้วย ความต้านทานในขอบระหว่างพวกเขาบอกคุณออกปัจจุบัน / เข้าโหนดพิเศษของคุณ เนื่องจากนี่เป็นโหนด "แบตเตอรี" ปัจจุบันจึงต้องเป็นปัจจุบันทั้งหมด เนื่องจากแรงดันไฟฟ้าคือตามคำจำกัดความหาร 1 ด้วยผลรวมของสี่กระแสเหล่านี้ที่คุณพบจะบอกความต้านทานรวม1V
ฉันกำลังดูรหัสบางอย่างฉันเขียนผลรวมนั้นด้วยความคิดเห็นจำนวนมากเพียง 67 บรรทัด ดังนั้นจึงไม่ยากที่จะเขียน
"สรุปสั้น ๆ " ของแนวคิดนี้คือคุณใช้แบตเตอรี่จากนั้นดูว่าแรงดันไฟฟ้ากระจายไปทั่วทั้งระบบ เมื่อแรงดันไฟฟ้าคงที่ (เกณฑ์ของคุณสำหรับสิ่งนั้น) สิ่งที่คุณต้องทำคือดูที่กระแสไฟฟ้าเข้าหรือออกจากขั้วแบตเตอรี่หนึ่งขั้วหรืออีกขั้วหนึ่ง พวกเขาทั้งสองควรเป็นค่าปัจจุบันเดียวกัน (ภายในขอบเขตตัวเลข) ด้วยเหตุผลที่ชัดเจน1V
ทำไมคุณต้องแยกระบบออกเป็น i + j = even และ i + j = คี่
สมมติว่าคุณคำนวณขวา) นี้อ้างอิงโหนดที่ล้อมรอบ{5,5} ไม่เป็นไร. สมมติว่าคุณคำนวณต่อไปขวา) โปรดทราบว่าในรายการพารามิเตอร์เป็นค่าที่คุณเพิ่งคำนวณเพื่อ ? สิ่งนี้จะ "เปื้อน" สิ่งต่างๆมากมาย มันไม่ใช่เสียง แต่ละรอบของคี่ / คู่ควร "ปรากฏราวกับว่า" เกิดขึ้นในช่วงเวลาเดียวกัน ดังนั้นการคำนวณครั้งต่อไปของคุณควรเป็นเพราะไม่มี อินพุตไปยังฟังก์ชันเป็นโหนดที่ถูกเปลี่ยนแปลงระหว่าง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 สำหรับการจำลอง:
ฉันทำให้มันสั้นและเรียบง่าย ในขณะที่คุณสามารถดูตัวอย่างปัจจุบันคำนวณจากแหล่งจ่ายไฟจะได้รับเป็น{} (ค่าจริงที่คำนวณโดย Spice คือ )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
ด้วยผลดังต่อไปนี้พิมพ์ออกมา:33.0856844038614 ซึ่งเป็นคำตอบที่ถูกต้องR=33.0856844038614Ω
โปรแกรมด้านบนแสดงวิธีการตั้งค่าตัวต้านทานแนวตั้งและแนวนอนรวมทั้งเมทริกซ์แรงดันไฟฟ้าเพื่อให้การทดสอบบางอย่างง่ายขึ้นสำหรับโหนดที่ไม่มีอยู่และ / หรือค่าตัวต้านทาน รหัสนี้ค่อนข้างจะสะอาดกว่านี้ด้วยวิธีนี้ถึงแม้ว่ามันจะต้องมีองค์ประกอบเพิ่มเติมอีกหลายอย่าง (ฉันเพิ่งทำค่าตัวต้านทานพิเศษแบบไม่มีที่สิ้นสุดในค่า) เพียงเปรียบเทียบวิธีที่ฉันตั้งค่าอาร์เรย์กับวิธีที่วางแผนผังไว้เช่นกันและฉันคิดว่าคุณจะสามารถทำงานได้ทั้งหมด รายละเอียดที่นี่
ฉันเคยแฮ็กตัวต้านทานและค่าโหนดแล้วโดยที่ไม่ต้องทำสิ่งนี้เป็นโปรแกรมวัตถุประสงค์ทั่วไปเพื่ออ่านตารางค่า แต่เรื่องทั่วไปนั้นค่อนข้างง่ายที่จะเพิ่ม และรหัสนี้ควรทำให้ทุกอย่างที่ฉันเขียนไม่คลุมเครืออย่างแน่นอน
โปรดทราบว่าฉันเพิ่งวิ่ง loop 1000 ประเภทด้วยการสลับสีแดงและดำภายใน loop ฉันแค่เลือกหมายเลข หากต้องการทำให้เป็นวัตถุประสงค์ทั่วไปมากขึ้นคุณอาจต้องการวิธีที่แตกต่างกันในการพิจารณาว่ามีการวนซ้ำหลายครั้งเพื่อดำเนินการอย่างไรxx
และบันทึกย่อสุดท้าย เพื่อพิสูจน์ว่าคุณสามารถใช้กระแสของโหนดแรงดันไฟฟ้าคงที่เพื่อคำนวณตัวต้านทานฉันใช้สองบรรทัดเพื่อพิมพ์ค่าทั้งสอง: หนึ่งค่าที่คำนวณได้จากด้านและอีกหนึ่งค่าที่คำนวณได้จากด้านข้าง ทั้งสองวิธีคุณควรเห็นหมายเลขเดิม0V1V
(โอเคโน้ตสุดท้ายอีกอันนี่จะเป็นเป้าหมายที่ดีกว่ามากที่ F # หรือคอมไพเลอร์ที่เหมาะสมที่มีระบบการคำนวณแบบขนานขนาดใหญ่การคำนวณแต่ละรายการใน "สีแดง" หรือ "สีดำ" สามารถดำเนินการคู่ขนานได้อย่างอิสระ F # ทำให้สิ่งนี้เล็กน้อยดังนั้นโค้ดใน F # คุณสามารถเรียกใช้สิ่งนี้ได้บนคอร์ที่มีอยู่ทั้งหมดโดยไม่ต้องทำอะไรเป็นพิเศษมันใช้งานได้แค่บันทึกในกรณีที่คุณกำลังรวบรวมข้อมูลจำนวนมากในแบบแฟชั่นและอาจต้องการใช้ ประโยชน์เต็มที่ของระบบมัลติคอร์)
หมายเหตุที่สิ้นสุด:
การสืบทอดนั้นค่อนข้างง่ายจาก KCL วางตัวต้านทานสี่ตัวลงในการจัดเรียงต่อไปนี้:
จำลองวงจรนี้ - แผนผังที่สร้างโดยใช้CircuitLab
ใช้ KCL:
VR1+VR2+VR3+VR4V=V1R1+V2R2+V3R3+V4R4∴=(V1R1+V2R2+V3R3+V4R4)(R1∣∣R2∣∣R3∣∣R4)
บางคนเล่นกับพีชคณิตได้รับผลลัพธ์ที่ฉันใช้ในรหัส