Использование Python для решения «куба резистора»

Это вычислительная проблема.

Мой код:

import numpy as np

# Number of nodes in the cube
num_nodes = 8

# Create the conductance matrix G and the current vector I
G = np.zeros((num_nodes, num_nodes))
I = np.zeros(num_nodes)

# Define resistances
R1 = 0.18  # Resistance for R1
R = 1      # Resistance for other resistors

# Function to add conductances between nodes i and j with resistance R
def add_conductance(G, i, j, R):
    conductance = 1 / R
    G[i, i] += conductance
    G[j, j] += conductance
    G[i, j] -= conductance
    G[j, i] -= conductance

# Define the connections for the cube (each edge of the cube)
edges = [
    (0, 1, R), (1, 2, R), (2, 3, R), (3, 0, R),  # Bottom face
    (4, 5, R), (5, 6, R), (6, 7, R), (7, 4, R),  # Top face
    (0, 4, R), (1, 5, R), (2, 6, R), (3, 7, R),  # Vertical edges
    (3, 4, R1)                                   # Special resistor R1
]

# Add conductances to the matrix G
for i, j, R_val in edges:
    add_conductance(G, i, j, R_val)

# Define the current injections (1A into node 0 and -1A out of node 7)
I[0] = 1   # Inject 1A at node 0 (node A)
I[7] = -1  # Extract 1A at node 7 (node B)

# To avoid singular matrix, we ground node 7 (remove last row and column from G and I)
G_reduced = np.delete(np.delete(G, 7, axis=0), 7, axis=1)
I_reduced = np.delete(I, 7)

# Solve for the node voltages
V_reduced = np.linalg.solve(G_reduced, I_reduced)

# Insert the ground node voltage back (V[7] = 0)
V = np.insert(V_reduced, 7, 0)

# Calculate the equivalent resistance as the voltage difference between nodes 0 and 7
R_eq = V[0] - V[7]

print(f"The equivalent resistance between A and B is {R_eq:.3f} ohms.")

Однако код дает неправильные значения, которые я могу проверить.

Почему у вас стоит R1 = 0.18, когда в вопросе упоминается 0,5?

9769953 16.05.2024 15:22

(Кроме того, пожалуйста, по крайней мере, включите текст вопроса как обычный текст. Текст изображения плохо читается из-за его светлого и мелкого шрифта.)

9769953 16.05.2024 15:22

Вы определяете R1 как (3, 4, R1). Кажется, это диагональ, в отличие от изображения. Кроме того, в результате получается куб с 13 ребрами.

9769953 16.05.2024 15:25

Далее вы подаете ток в узел 0, который, согласно определению вашего куба, находится на нижней грани, но на рисунке показано, что он находится наверху. И наоборот для выходного узла 7, который по вашему определению находится вверху, но на рисунке видно, что он внизу. При наличии симметрии это не было бы проблемой, но куб не симметричен из-за наличия R1. Кроме того, узел 0 и узел 7 не противоположны друг другу, как на картинке.

9769953 16.05.2024 15:28

Каков вообще ожидаемый ответ? И какой ответ вы получаете сейчас?

9769953 16.05.2024 15:36

Я считаю, что общее сопротивление составляет 0,7632 Ом. Есть желающие?

lastchance 16.05.2024 17:06

@ 9769953 Привет, у меня был R1 = 0,18, потому что я действительно мог протестировать разные R1, чтобы увидеть, дает ли код последовательные правильные или неправильные ответы. И я не был уверен, как решить эту проблему (вручную), поэтому я зашел в Google, чтобы посмотреть анализ, и мой код, по сути, представляет собой числовую версию этого анализа, который я нашел в Интернете, я думаю, именно поэтому все противоречиво.. ..Что касается ожидаемого ответа, то я его не вижу. ожидаемый ответ я могу проверить только в том случае, если мой ответ правильный.

Tomy 17.05.2024 08:10

Получив напряжения в узлах, вы можете проверить свой ответ. Ток — это падение напряжения, деленное на сопротивление, тогда чистый ток на каждом переходе равен 0.

lastchance 17.05.2024 09:15
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
8
81
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я попробовал исправить ваш код. Номера ваших узлов несовместимы (как заметил пользователь 9769953). Я поставил 0-3 вверху и 4-7 внизу. Текущий вход в 0 и выход в 6.

Это выглядит примерно так:

   I
===>=== 0----------3
       /.         /|
      / .        / |
     1----------2  |
     |  4 . . . |. 7
     | .        | /
     |.         |/    I
     5----------6 ===>===

Вы настроили R1 неправильно.

Чтобы заземлить одно значение (скажем, V6), вам НЕ нужно удалять эту линию: просто измените ее на все нули, кроме 1 по диагонали, и установите правую часть на 0.

Если R1 = 0,5 (как указано в вопросе, но не в вашем коде), вы получите следующее.

import numpy as np

# Number of nodes in the cube
num_nodes = 8

# Create the conductance matrix G and the current vector I
G = np.zeros((num_nodes, num_nodes))
I = np.zeros(num_nodes)

# Define resistances
R1 = 0.5   # Resistance for R1                                    # <======= corrected
R = 1      # Resistance for other resistors

# Function to add conductances between nodes i and j with resistance R
def add_conductance(G, i, j, R):
    conductance = 1 / R
    G[i, i] += conductance
    G[j, j] += conductance
    G[i, j] -= conductance
    G[j, i] -= conductance

# Define the connections for the cube (each edge of the cube)
edges = [
          (0, 1, R), (1, 2, R), (2, 3, R), (3, 0, R1),     # Top face (corrected R1 and node numbers)
          (4, 5, R), (5, 6, R), (6, 7, R), (7, 4, R ),     # Bottom face (corrected node numbers to match current)
          (0, 4, R), (1, 5, R), (2, 6, R), (3, 7, R )      # Vertical edges
        ]

# Add conductances to the matrix G
for i, j, R_val in edges:
    add_conductance(G, i, j, R_val)

# Define the current injections (1A into node 0 and -1A out of node 6)
I[0] = 1   # Inject 1A at node 0 (node A)
I[6] = -1  # Extract 1A at node 6 (node B)       <====== Corrected

# To avoid singular matrix FORCE V[6] to be 0
G[6,:] = 0;   G[6,6] = 1.0;   I[6] = 0

# Solve for the node voltages
V = np.linalg.solve(G, I)

# Calculate the equivalent resistance as the voltage difference between nodes 0 and 6    # <==== Corrected
R_eq = V[0] - V[6]

print( "Conductance matrix:" )
print( G )
print( "\nVoltages:" )
print( V )
print(f"\nThe equivalent resistance between A and B is {R_eq:.3f} ohms.")

Выход:

Conductance matrix:
[[ 4. -1.  0. -2. -1.  0.  0.  0.]
 [-1.  3. -1.  0.  0. -1.  0.  0.]
 [ 0. -1.  3. -1.  0.  0. -1.  0.]
 [-2.  0. -1.  4.  0.  0.  0. -1.]
 [-1.  0.  0.  0.  3. -1.  0. -1.]
 [ 0. -1.  0.  0. -1.  3. -1.  0.]
 [ 0.  0.  0.  0.  0.  0.  1.  0.]
 [ 0.  0.  0. -1. -1.  0. -1.  3.]]

Voltages:
[ 7.63157895e-01  4.73684211e-01  3.42105263e-01  5.52631579e-01
  4.73684211e-01  3.15789474e-01 -9.32233669e-18  3.42105263e-01]

The equivalent resistance between A and B is 0.763 ohms.

Огромное вам спасибо... Я даже не знал, как решить это вручную, поэтому я последовал анализу какого-то парня, которого нашел в Интернете. Думаю, он использовал другую систему нумерации... я понимаю, где я сейчас пошло не так! Спасибо

Tomy 17.05.2024 08:18

Другие вопросы по теме