Форум программистов, компьютерный форум, киберфорум
Python: Научные вычисления
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 08.05.2017
Сообщений: 9

Одномерный массив, каждый элемент которого - матрица 2х2 для задачи анализа электрической цепи

13.09.2017, 09:29. Показов 1062. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Для решения задачи анализа электрической цепи, представляющей собой каскадное соединение четырёхполюсников удобно использовать одномерный массив, каждый элемент которого - это матрица 2х2, содержащая А-параметры каждого четырёхполюсника.
Решая эту задачу в Python (здесь я новичок, всю жизнь работал в PTC Mathcad), столкнулся с проблемой: матрица 2х2 после занесения её в массив в качестве единичного элемента этого массива, превращается в массив 2х2 со всеми вытекающими последствиями, ключевое из которых в моём случае - это лишение возможности матричного произведения.

код:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import numpy as np
A = np.matrix([[1, 0], [0, 1]])
B = np.matrix([[2, 3], [4, 5]])
 
N = np.array ([A, B])
print ('Исходные матрицы А и B: ')
print (A)
print (B)
print ('Перемножаются по правилу "строка на столбец": A * B =')
print (A*B)
print ('Но если записать их в массив N = np.array ([A, B]):')
print (N)
print ('то они потеряют свойства матриц и будут перемножаться поэлементно, как массивы 2х2: N[0] * N[1] = ')
print (N[0]*N[1])
print ('То есть, они из матриц превращаются в массивы: type (N[0]) = ', type (N[0]))
Результат:


Есть ли возможность перемножать элементы массива N по правилам произведения матриц, не прибегая к созданию новых матриц из каждого элемента массива?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.09.2017, 09:29
Ответы с готовыми решениями:

Организовать одномерный массив, каждый элемент которого есть минимальный элемент в соответствующей строке матрицы
Добрый день. Я учусь программировать в Turbo C(Не с++, а именно эта версия). Не могу найти необходимой литературы или пример программ. Кто...

Составить программу, генерирующую одномерный массив, каждый элемент которого равен сумме положительных элемент
Составить программу, генерирующую одномерный массив, каждый элемент которого равен сумме положительных элементов соответствующего столбца...

дан двумерный массив. сформировать одномерный массив, каждый элемент которого равен:
дан двумерный массив. сформировать одномерный массив, каждый элемент которого равен: -первому четному элементу соответствующего столбца,...

8
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
13.09.2017, 13:06
Если положить ваши матрицы в обычный список python - они останутся матрицами:
Python
1
2
3
4
5
6
7
8
>>>N=[A,B]
>>>N[0] * N[1]
matrix([[2, 3],
        [4, 5]])
 
>>> type(N[0])
<class 'numpy.matrixlib.defmatrix.matrix'>
>>>
Хотя, не уверен что это правильное решение в данном случае.
1
0 / 0 / 0
Регистрация: 08.05.2017
Сообщений: 9
13.09.2017, 14:17  [ТС]
Garry Galler, спасибо. Пока что так и сделал.
Второй вариант - задавать массивы, но перемножать их оператором matmul
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
14.09.2017, 11:32
Для умножения матриц используйте numpy.dot (такой метод есть также у np-массива).
Массив лучше сразу делать трёхмерный, n*2*2.
1
0 / 0 / 0
Регистрация: 08.05.2017
Сообщений: 9
19.09.2017, 17:56  [ТС]
Как выяснилось, и у matmul, и у dot есть серьёзный недостаток: можно за одну операцию перемножить только две матрицы:
N = np.matmul (N1, N2), или же N = np.dot (N1, N2). А зачастую цепь представляется каскадным соединением большего числа эквивалентных четырёхполюсников, и вместо одной строки при использовании np.matrix N = N1 * N2 * N3 * ... при использовании np.array придётся делать цикл.
Я хотел было использовать оператор '@' (он эквивалентен matmul) для перемножения более двух массивов по матричным правилам, однако, начиная с трёх и более множителей умножение производится поэлементно.

Добавлено через 11 минут
Ой, я выше чушь написал. "@" корректно работает при любом количестве сомножителей.
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
20.09.2017, 10:59
Цикл писать в лобом случае не нужно.
Я ожидал, что умножение матриц можно сделать через numpy.reduce, но оказалось, что матричное умножение он не поддерживает. Но всё равно есть просто питоновский reduce и numpy.linalg.multi_dot:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import numpy as np
 
a = np.array([
    [[1,4],
     [5,7]],
    [[5,1],
     [7,9]],
    [[7,2],
     [3,4]],
    [[9,3],
     [5,4]]
]
)
 
print("manually dot", a[0].dot(a[1]).dot(a[2]).dot(a[3]))
# print("numpy reduce", np.ufunc.reduce(np.ufunc.multiply, a)) <- don't work
 
from functools import reduce
print("python reduce", reduce(np.dot, a))
print("multi_dot", np.linalg.multi_dot(a))
1
0 / 0 / 0
Регистрация: 08.05.2017
Сообщений: 9
20.09.2017, 12:04  [ТС]
dondublon, спасибо, тоже попробую
0
 Аватар для oldnick85
36 / 34 / 10
Регистрация: 15.07.2017
Сообщений: 128
07.10.2017, 20:01
У меня такое сработало:
Python
1
2
3
N = np.array([None, None])
N[0] = A
N[1] = B
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
09.10.2017, 12:42
oldnick85, во-первых, не надо так делать. Во-вторых, нужно было лаконичное умножение матриц.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.10.2017, 12:42
Помогаю со студенческими работами здесь

Дан одномерный массив, получить другой массив той же размерности, каждый элемент которого b[i]=a[1]+.+a[i]
Дан одномерный массив, получить другой массив той же размерности, каждый элемент которого равен b=a+a+...+a.

Массив: Сформировать одномерный массив, каждый элемент которого равен наибольшему элементу соответствующего столбца
Требования к программам: Исходная матрица должна быть выведена на экран в виде таблицы. Все преобразования производить с исходным...

Сформировать одномерный массив, каждый элемент которого равен наибольшему
многомерный массив реализовать с помощью списков; • многомерный массив заполнить случайным образом, если не указан способ формирование...

Дан двумерный массив. Сформировать одномерный массив, каждый элемент которого равен произведению положительных элементов
Дан двумерный массив. Сформировать одномерный массив, каждый элемент которого равен произведению положительных элементов.Ребят помогите...

Двумерный массив. Сформировать одномерный массив, каждый элемент которого равен первому четному элементу соответствующего столбца
Дан двумерный массив, целых чисел. Сформировать одномерный массив, каждый элемент которого равен первому четному элементу соответствующего...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru