Как написать программу для системы уравнений

Написать программу решения системы двух линейных уравнений с двумя неизвестными и вывода его корней на экран. A1X + B1Y = H1 A2X + B2Y = H2. Алгоритм решения реализовать в виде процедуры. Входные параметры процедуры — коэффициенты и свободные члены, выходные — решения X и Y.

Код к задаче: «Написать программу решения системы двух линейных уравнений с двумя неизвестными и вывода его корней на экран.»

Листинг программы

uses crt; procedure Korni(a1,b1,c1,a2,b2,c2:real;var x,y:real); begin if abs(a1*b2-a2*b1) b2:=b1+b2*(-a1/a2); c2:=c1+c2*(-a1/a2); y:=c2/b2; x:=(c1-b1*y)/a1; end; end; var a1,b1,h1,a2,b2,h2,x,y:real; begin clrscr; writeln(‘Введите коэффициенты первого уравнения:’); readln(a1,b1,h1); writeln(‘Введите коэффициенты второго уравнения:’); readln(a2,b2,h2); Korni(a1,b1,h1,a2,b2,h2,x,y); writeln(‘Корни системы:’); write(‘x=’,x:0:2,’ y=’,y:0:2); readln; end.

Источник: studassistent.ru

Решение систем уравнений методом подстановки

Решаем систему линейных алгебраических уравнений с Python-пакетом scipy.linalg (не путать с numpy.linalg)

Аппарат линейной алгебры применяют в самых разных областях — в линейном программировании, эконометрике, в естественных науках. Отдельно отмечу, что этот раздел математики востребован в машинном обучении. Если, например, вам нужно поработать с матрицами и векторами, то, вполне возможно, на каком-то шаге вам придётся решать систему линейных алгебраических уравнений (СЛАУ).

СЛАУ — мощный инструмент моделирования процессов. Если некая хорошо изученная модель на основе СЛАУ годится для формализации задачи, то с высокой вероятностью её можно будет решить. А вот насколько быстро — это зависит от вашего инструментария и вычислительных мощностей.

Я расскажу про один из таких инструментов — Python-пакет scipy.linalg из библиотеки SciPy, который позволяет быстро и эффективно решать многие задачи с использованием аппарата линейной алгебры.

В этом туториале вы узнаете:

  • как установить scipy.linalg и подготовить среду выполнения кода;
  • как работать с векторами и матрицами с помощью NumPy;
  • почему scipy.linalg лучше, чем numpy.linalg;
  • как формализовать задачи с использованием систем линейных алгебраических уравнений;
  • как решать СЛАУ с помощью scipy.linalg (на реальном примере).

Когда речь идёт о математике, изложение материала должно быть последовательным — таким, чтобы одно следовало из другого. Эта статья не исключение: сначала будет много подготовительной информации и только потом мы перейдём непосредственно к делу.

Если готовы к этому — приглашаю под кат. Хотя, честно говоря, некоторые разделы можно пропускать — например, основы работы с векторами и матрицами в NumPy (если вы хорошо знакомы с ним).

Python для самых маленьких. Линейные уравнения. Решение задач


Установка scipy.linalg

SciPy — это библиотека Python с открытым исходным кодом для научных вычислений: решение СЛАУ, оптимизация, интеграция, интерполяция и обработка сигналов. Помимо linalg, она содержит несколько других пакетов — например, NumPy, Matplotlib, SymPy, IPython и pandas.

Читайте также:
Программа которая показывает кто подключен к Wi-Fi

Среди прочего, scipy.linalg содержит функции для с работы с матрицами — вычисление определителя, инверсия, вычисление собственных значений и векторов, а также сингулярное разложение.

Чтобы использовать scipy.linalg, вам необходимо установить и настроить библиотеку SciPy. Это можно сделать с помощью дистрибутива Anaconda, а также системы управления пакетами и инсталлятора Conda.

Для начала подготовьте среду выполнения для библиотеки:

$ conda create —name linalg $ conda activate linalg

Установите необходимые пакеты:

(linalg) $ conda install scipy jupyter

Эта команда может работать долго. Не пугайтесь!

Я предлагаю использовать Jupyter Notebook для запуска кода в интерактивной среде. Это не обязательно, но лично мне он облегчает работу.

Перед открытием Jupyter Notebook вам необходимо зарегистрировать экземпляр conda linalg, чтобы использовать его в качестве ядра при создании ноутбука. Для этого выполните следующую команду:

(linalg) $ python -m ipykernel install —user —name linalg

Теперь можно открыть Jupyter Notebook:

$ jupyter notebook

Когда он загрузится в вашем браузере, создайте новый notebook, нажав New → linalg:

Чтобы убедиться, что установка библиотеки SciPy прошла успешно, введите в ноутбуке:

>>> In [1]: import scipy

NumPy для работы с векторами и матрицами (куда же без него)

Сложно переоценить роль векторов и матриц при решении технических задач и, в том числе, задач машинного обучения.

NumPy — это наиболее популярный пакет для работы с матрицами и векторами в Python. Часто его применяют в сочетании с scipy.linalg. Чтобы начать работу с матрицами и векторами, нужно импортировать пакет NumPy:

>>> In [2]: import numpy as np

Для представления матриц и векторов NumPy использует специальный тип, называемый ndarray. Чтобы создать объект ndarray, вы можете использовать array ().

Например, вам нужно создать следующую матрицу:

Создадим матрицу как набор вложенных списков (векторов-строк):

>>> In [3]: A = np.array([[1, 2], [3, 4], [5, 6]]) . A Out[3]: array([[1, 2], [3, 4], [5, 6]])

Заметьте, что приведённый выше вывод (Outp[3]) достаточно наглядно показывает получившуюся матрицу.

И ещё: все элементы матрицы должны и будут иметь один тип. Это можно проверить с помощью dtype.

>>> In [4]: A.dtype Out[4]: dtype(‘int64’)

Здесь элементы являются целыми числами, поэтому их общий тип по умолчанию — int64. Если бы среди них было хотя бы одно число с плавающей точкой, все элементы получили бы тип float64:

>>> In [5]: A = np.array([[1.0, 2], [3, 4], [5, 6]]) . A Out[5]: array([[1., 2.], [3., 4.], [5., 6.]]) In [6]: A.dtype Out[6]: dtype(‘float64’)

Чтобы вывести на экран размерность матрицы, можно использовать метод shape:

>>> In [7]: A.shape Out[7]: (3, 2)

Как и ожидалось, размерность матрицы A 3×2, то есть A имеет три строки и два столбца.

Читайте также:
В какой программе рисовать мангу

При работе с матрицами часто приходится использовать операцию транспонирования, которая столбцы превращает в строки и наоборот. Чтобы транспонировать вектор или матрицу (представленную объектом типа ndarray), вы можете использовать .transpose () или .T. Например:

>>> In [8]: A.T Out[8]: array([[1., 3., 5.], [2., 4., 6.]])

Чтобы создать вектор, также можно использовать.array(), передав туда список значений в качестве аргумента:

>>> In [9]: v = np.array([1, 2, 3]) . v Out[9]: array([1, 2, 3])

По аналогии с матрицами, используем .shape(), чтобы вывести на экран размерность вектора:

>>> In [10]: v.shape Out[10]: (3,)

Заметьте, что она выглядит как (3,), а не как (3, 1) или (1, 3). Разработчики NumPy решили сделать отображение размерности векторов так же, как в MATLAB.

Чтобы получить на выходе размерность (1, 3), нужно было бы создать вот такой массив:

>>> In [11]: v = np.array([[1, 2, 3]]) . v.shape Out[11]: (1, 3)

Для (3, 1) — вот такой:

>>> In [12]: v = np.array([[1], [2], [3]]) . v.shape Out[12]: (3, 1)

Как видите, они не идентичны.

Часто возникает задача из вектора-строки сделать вектор-столбец. Как вариант, можно сначала создать вектор-строку, а потом использовать .reshape() для его преобразования в столбец:

>>> In [13]: v = np.array([1, 2, 3]).reshape(3, 1) . v.shape Out[13]: (3, 1)

В приведённом выше примере мы использовали .reshape() для получения вектора-столбца с размерностью (3, 1) из вектора с размерностью(3,). Стоит отметить, что .reshape() делает преобразование с учётом того, что количество элементов (100% заполненных мест) в массиве с новой размерностью должно быть равно количеству элементов в исходном массиве.

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

Заполнение массивов данными

NumPy позволяет быстро создавать и заполнять массивы. Например, чтобы создать массив, заполненный нулями, можно использовать .zeros():

>>> In [15]: A = np.zeros((3, 2)) . A Out[15]: array([[0., 0.], [0., 0.], [0., 0.]])

В качестве аргумента .zeros() нужно указать размерность массива, упакованную в кортеж (перечислить значения через запятую и обернуть это в круглые скобки). Элементы созданного массива получат тип float64.

Точно так же, для создания массивов из единиц можно использовать .ones ():

>>> In [16]: A = np.ones((2, 3)) . A Out[16]: array([[1., 1., 1.], [1., 1., 1.]])

Элементы созданного массива также получат тип float64.

Создать массив, заполненный случайными числами, поможет .random.rand():

>>> In [17]: A = np.random.rand(3, 2) . A Out[17]: array([[0.8206045 , 0.54470809], [0.9490381 , 0.05677859], [0.71148476, 0.4709059 ]])

Говоря точнее, метод .random.rand() возвращает массив с псевдослучайными значениями (от 0 до 1) из множества, сгенерированного по закону равномерного распределения. Обратите внимание, что в отличие от .zeros() и .ones(), .random.rand () на вход принимает не кортеж, а просто два значения через запятую.

Читайте также:
Программа как нарисовать аниме

Чтобы получить массив с псевдослучайными значениями, взятыми из множества, сгенерированного по закону нормального распределения с нулевым средним и единичной дисперсией, вы можете использовать .random.randn():

>>> In [18]: A = np.random.randn(3, 2) . A Out[18]: array([[-1.20019512, -1.78337814], [-0.22135221, -0.38805899], [ 0.17620202, -2.05176764]])

Почему scipy.linalg лучше, чем numpy.linalg

NumPy имеет встроенный модуль numpy.linalg для решения некоторых задач, связанных с аппаратом линейной алгебры. Обычно scipy.linalg рекомендуют использовать по следующим причинам:

    В официальной документации сказано, что scipy.linalg содержит все функции numpy.linalg, а также дополнительные функции, не входящие в numpy.linalg.

В следующем разделе мы применим scipy.linalg для работы с системами линейных алгебраических уравнений. Наконец-то практика!

Формализация и решение задач с scipy.linalg

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

В этом разделе вы узнаете, как использовать scipy.linalg.solve() для решения СЛАУ. Но прежде чем приступить к работе с кодом, займёмся формализацией задачи и далее рассмотрим простой пример.

Система линейных алгебраических уравнений — это набор из m уравнений, n переменных и вектора свободных членов. Прилагательное «линейных» означает, что все переменные имеют первую степень. Для простоты рассмотрим СЛАУ, где m и n равны 3:

Есть ещё одно требование к «линейности»: коэффициенты K₁ … K₉ и вектор b₁ … b₃ должны быть константами (в математическом смысле этого слова).

В реальных задачах СЛАУ обычно содержат большое количество переменных, что делает невозможным решение систем вручную. К счастью, такие инструменты, как scipy.linalg, могут выполнить эту тяжелую работу.

Задача 1

Написание программы для решения системы уравнений методом сеток

Задание: Написать программу, которая решала бы методом сеток следующую систему уравнений:

a1(x,y)*d 2 U/dx 2 + a2(x,y)*d 2 U/dxdy+ a3(x,y)*d 2 U/dy 2 + b1(x,y)*dU/dx+ b2(x,y)*dU/dy+c(x,y)*U(x,y)=f(x,y) ;

Рассчитать погрешность метода.

Составить три тестовых примера для программы.

Пользователь задаёт прямоугольную область, на которой применяется метод сеток через координаты левого нижнего (a0,b0) и правого верхнего (a,b) углов области , а также количество узлов сетки по x и y (Nx,Ny).

Программой вычисляется шаг сетки (hx и hy) и формируется матрица Size*Size+1, где Size – количество точек сетки, то есть Nx*Ny. Матрица формируется следующим образом: для всех внутренних узлов сетки все виды производных можно приближённо записать через соседние точки:

Таким образом, эллиптическое уравнение для каждой из внутренних точек можно переписать относительно соседних точек в следующем виде:

Получается уравнений столько же, сколько и внутренних точек, но с Size неизвестными. Недостающие уравнения получаем из краевых условий.

Решаем полученную матрицу методом Гаусса и получаем вектор со значениями функции в узлах сетки.

1. U(x,y) = x 3 + y 3 ;

В программу забиваем следующие параметры:

f(x,y) = a1(x,y)*(6*x + y*y*y) + a2(x,y)*(3*x*x + 3*y*y) + a3(x,y)*(x*x*x + 6*y) +

+ b1(x,y)*(3*x*x+y*y*y) + b2(x,y)*(x*x*x + 3*y*y) + c(x,y)*(x*x*x + y*y*y).

Q1(x) = x*x*x + b0*b0*b0.

Q2(x) = x*x*x + bn*bn*bn.

Q3(y) = y*y*y + a0*a0*a0.

Q4(y) = y*y*y + an*an*an.

Источник: vunivere.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru