4.2: Лінійні рівняння
- Page ID
- 79646
У фізиці нас часто закликають вирішувати лінійні рівняння виду
\[\mathbf{A} \vec{x} = \vec{b},\]
де\(\mathbf{A}\) деяка\(N\times N\) матриця, і обидва\(\vec{x}\) і\(\vec{b}\) є векторами для довжини\(N\). З огляду на\(\mathbf{A}\) і\(\vec{b}\), мета полягає в вирішенні для\(\vec{x}\).
Це важливий і корисний навик розпізнавати лінійні системи рівнянь, коли вони виникають у задачах фізики. Такі рівняння можуть виникати в багатьох різноманітних контекстах; нижче ми наведемо пару простих прикладів.
Приклад\(\PageIndex{1}\)
Припустимо, є набір\(N\) електрично заряджених точкових частинок в положеннях\(\{\vec{R}_0, \vec{R}_1, \dots, \vec{R}_{N-1}\}\). Ми не знаємо значення електричних зарядів, але ми можемо виміряти електричний потенціал в будь-якій точці\(\vec{r}\). Електричний потенціал задається
\[\phi(\vec{r}) = \sum_{j=0}^{N-1} \frac{q_j}{|\vec{r}-\vec{R}_j|}.\]
Якщо ми виміряємо потенціал на\(N\) позиціях\(\{\vec{r}_0, \vec{r}_1, \dots, \vec{r}_{N-1}\}\), як можна вивести\(\{q_0,\dots,q_{N-1}\}\) нарахування?
Рішення
Для цього напишемо рівняння електричного потенціалу в точці\(\vec{r}_i\) як:
\[\phi(\vec{r}_i) = \sum_{j=0}^{N-1} \left[\frac{1}{|\vec{r}_i-\vec{R}_j|}\right] \, q_j.\]
Це має вигляд\(\mathbf{A} \vec{x} = \vec{b}\), де\(\mathbf{A}_{ij} \equiv \frac{1}{|\vec{r}_i-\vec{R}_j|}\)\(\vec{b}_i \equiv \phi(\vec{r}_i)\), і невідомі є\(\vec{x}_j = q_j\).
Приклад\(\PageIndex{2}\)
Лінійні системи рівнянь зазвичай з'являються в теорії кіл. Для прикладу розглянемо наступну паралельну схему блоків\(N\) живлення і опорів:

Припустимо, що напруга на правій стороні ланцюга є\(V_{0}=0\). З огляду на\(\{R_0, \dots, R_{N-1}\}\) опори і ЕРС\(\{\mathcal{E}_0, \dots, \mathcal{E}_{N-1}\}\), як ми знаходимо ліву напругу\(V\) і струми\(\{\mathcal{I}_0, \dots, \mathcal{I}_{N-1}\}\)?
Рішення
Слідуємо звичним законам теорії кіл. Кожна гілка паралельного контуру підпорядковується закону Ома,
\[\mathcal{I}_j R_j + V = \mathcal{E}_j.\]
Крім того, течії підкоряються закону Кірхофа (збереження струму), тому
\[\sum_{j=0}^{N-1} \mathcal{I}_j = 0.\]
Ми можемо об'єднати ці\(N+1\) рівняння в матричне рівняння виду\(\mathcal{A}\,\vec{x} = \vec{b}\)
\[\begin{bmatrix}R_0 & 0 & \cdots & 0 & 1 \\ 0 & R_1 & \cdots & 0 & 1 \\ \vdots & \vdots &\ddots & \vdots & \vdots \\ 0& 0& \cdots & R_{N-1} & 1 \\ 1& 1& \cdots & 1& 0\end{bmatrix} \begin{bmatrix}\mathcal{I}_0 \\ \mathcal{I}_1 \\ \vdots \\ \mathcal{I}_{N-1} \\ V\end{bmatrix} = \begin{bmatrix}\mathcal{E}_0 \\ \mathcal{E}_1 \\ \vdots \\ \mathcal{E}_{N-1} \\ 0\end{bmatrix}\]
Тут невідомий вектор\(\vec{x}\) складається з\(N\) струмів, що проходять через гілки ланцюга, і потенціалу\(V\).
4.2.1 Пряме рішення
Зіткнувшись із системою лінійних рівнянь, перший інстинкт зазвичай вирішується\(\vec{x}\) шляхом інвертування матриці\(\mathbf{A}\):
\[\mathbf{A} \vec{x} = \vec{b} \quad\Rightarrow\quad \vec{x} = \mathbf{A}^{-1}\, \vec{b}.\]
Не робіть цього. Це математично правильно, але чисельно неефективно. Як ми побачимо, обчислення матриці, оберненої\(\mathbf{A}^{-1}\), а потім праворуч множення на\(\vec{b}\), включає більше кроків, ніж просто рішення рівняння безпосередньо
Для розв'язання системи лінійних рівнянь використовують функцію розв'язання з модуля scipy.linalg. (Вам потрібно буде імпортувати scipy.linalg явно, оскільки він є підмодулем Scipy і не імпортується нашим звичайним з оператора scipy import *.) Ось приклад:
>>> A = array([[1., 2., 3.], [2., 4., 0.], [1., 3., 9.]]) >>> b = array([6., 6., 9.]) >>> >>> import scipy.linalg as lin >>> x = lin.solve(A, b) >>> x array([ 9., -3., 1.])
Ми можемо переконатися, що це дійсно рішення:
>>> dot(A, x) # This should equal b. array([ 6., 6., 9.])
Прямий розв'язувач використовує алгоритм, відомий як гаусова елімінація, про який ми розповімо в наступній статті. Час виконання гауссова елімінації -\(N\) це\(O(N^{3})\), де розмір задачі лінійної алгебри.
Причина, по якій ми уникаємо вирішення лінійних рівнянь шляхом інвертування матриці,\(\mathbf{A}\) полягає в тому, що матриця зворотна сама обчислюється за допомогою алгоритму гаусової елімінації! Якщо ви все одно збираєтеся використовувати гаусову елімінацію, набагато краще застосувати алгоритм безпосередньо на бажане\(\mathbf{A}\) і\(b\). Рішення шляхом обчислення\(\mathbf{A}^{-1}\) передбачає приблизно в два рази більше обчислювальних кроків.
