Используйте методы линейной алгебры SciPy для решения трех уравнений одновременно - PullRequest
1 голос
/ 06 января 2020

Question

Мой вопрос таков: как написать эти уравнения в массиве и решить?

from scipy import linalg
import numpy as np
import matplotlib.pyplot as plt

x = np.array[-23,1100,2300],[2300,1500,550],[550,1600,]

Я пытался записать в массив выше, но я не мог понять, как заменить «In» и «Vs2» в вопросе. Можете ли вы помочь мне решить вопрос?

Ответы [ 2 ]

1 голос
/ 06 января 2020

Вы хотите решить эти уравнения для нескольких напряжений, что предполагает использование for -l oop. Для ясности обычно лучше использовать идентификаторы для значений, например, R1, а не 1100. Поместите R1 в формулы и позвольте компьютеру выполнить простую арифметику c за вас.

Возможно, вы думаете об использовании функции linalg solve, поскольку вам нужно решить квадратную матрицу третьего порядка. Неизвестные - это токи. Поэтому сделайте алгебру так, чтобы у вас были выражения для коэффициентов матрицы и для правой части уравнения в терминах сопротивлений и напряжений.

Для матрицы (как указано в документации на https://docs.scipy.org/doc/scipy/reference/generated/scipy.linalg.solve.html#scipy .linalg.solve ),

a = np.array([[f1(Rs, Vs), f2(Rs, Vs), f3(Rs, Vs)], [...], [...]])

Для вектора справа

b = np.array([f4(Rs, Vs), f5(Rs,Vs), f6(Rs, Vs)])

Тогда currents = solve(a, b)

Обратите внимание, что f1, f2, et c - это те функции, которые нужно вычислять алгебраически.

Теперь поместите этот код в al oop, более или менее так:

for vs2 in [10,15,20,25]:
    currents = solve(a, b)

Поскольку у вас есть сопротивления и vs2 в ваших выражениях алгебры c, вы получите соответствующие токи. Вам нужно собрать токи, соответствующие напряжениям для построения графика.

Дополнение: Частичный результат алгебраической обработки c:

nothing more to say

Подробнее: Как мне избежать большей части надоедливой алгебры, используя библиотеку sympy:

>>> R1, R2, R3, R4, R5, Vs1 = 1100, 2300, 1500, 550, 1600, 23
>>> from sympy import *
>>> var('I1,I2,I3,Vs2')
(I1, I2, I3, Vs2)
>>> eq1 = -Vs1 + R1*I1 + R2 * (I1-I2)
>>> eq1
3400*I1 - 2300*I2 - 23
>>> eq2 = R2*(I2-I1)+R3*I2+R4*(I2-I3)
>>> eq2
-2300*I1 + 4350*I2 - 550*I3
>>> eq3 = R4*(I3-I2)+R5*I3 + Vs2
>>> eq3
-550*I2 + 2150*I3 + Vs2
>>> from scipy import linalg
>>> import numpy as np
>>> for Vs2 in [10,15,20,25]:
...     ls = np.array([[3400,-2300,0],[-2300,4350,-550],[0,-550,2150]])
...     rs = np.array([23, 0, -Vs2])
...     I = linalg.solve(ls, rs)
...     Vs2, I
...     
(10, array([ 0.01007914,  0.0048996 , -0.00339778]))
(15, array([ 0.00975305,  0.00441755, -0.00584667]))
(20, array([ 0.00942696,  0.0039355 , -0.00829557]))
(25, array([ 0.00910087,  0.00345346, -0.01074446]))
0 голосов
/ 09 января 2020

Чтобы решить линейную систему уравнений для неизвестного вектора x=In, который классически записывается как Ax=b, необходимо указать матрицу коэффициентов A и функцию правого вектора от b до linalg.solve , Основываясь на вашем вопросе, вам просто нужно переписать в матричной форме ваши три уравнения в терминах неизвестных токов, чтобы получить A и b, что было сделано с sympy, но здесь это довольно излишне. Далее следует более легкое для чтения решение с analyti c A:

from scipy.linalg import lu_factor, lu_solve
import numpy as np
import matplotlib.pyplot as plt

# your data
R1 = 1100
R2 = 2300
R3 = 1500
R4 = 550
R5 = 1600
Vs1 = 23
# Vs2 range of interest as a list
Vs2_range = [10,15,20,25]

# construct A: the coefficient matrix of the left-hand side in terms of In = [I1, I2, I3]
A = np.array([[ R1+R2,       -R2,     0],
              [   -R2,  R2+R3+R4,   -R4],
              [     0,       -R4, R4+R5]])

# pre-compute pivoted LU decomposition of A to solve Ax=b (because only b is changing here)
A_LU = lu_factor(A)

# initialize results
res = np.empty((len(Vs2_range),3))

# loop over Vs2 values
for i,Vs2 in enumerate(Vs2_range):
    # construct b: the right hand side vector for each Vs2
    b = np.array([Vs1,0,-Vs2])
    # then solve the linear system Ax=b
    In = lu_solve(A_LU,b)
    # stock results as rows of the res array
    res[i,:] = In

# plot each current In (column of res) vs Vs2_range    
for i in range(3):    
    plt.plot(Vs2_range,res[:,i],'-+',label='I'+str(i+1))  
plt.xlabel('Vs2 [V]')
plt.ylabel('I [A]')
plt.legend()

, которое дает: output

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...