Как составить систему уравнений в матлаб

Computational Considerations

One of the most important problems in technical computing is the solution of systems of simultaneous linear equations.

In matrix notation, the general problem takes the following form: Given two matrices A and b, does there exist a unique matrix x, so that Axb or xAb?

It is instructive to consider a 1-by-1 example. For example, does the equation

7x = 21

have a unique solution?

The answer, of course, is yes. The equation has the unique solution x = 3. The solution is easily obtained by division:

x = 21/7 = 3.

The solution is not ordinarily obtained by computing the inverse of 7, that is 7–1= 0.142857…, and then multiplying 7–1 by 21. This would be more work and, if 7–1 is represented to a finite number of digits, less accurate. Similar considerations apply to sets of linear equations with more than one unknown; MATLAB® solves such equations without computing the inverse of the matrix.

Although it is not standard mathematical notation, MATLAB uses the division terminology familiar in the scalar case to describe the solution of a general system of simultaneous equations. The two division symbols, slash, /, and backslash, , correspond to the two MATLAB functions mrdivide and mldivide. These operators are used for the two situations where the unknown matrix appears on the left or right of the coefficient matrix:

x = b/A

Denotes the solution to the matrix equation xA = b, obtained using mrdivide.

x = Ab

Denotes the solution to the matrix equation Ax = b, obtained using mldivide.

Think of “dividing” both sides of the equation Ax = b or xA = b by A. The coefficient matrix A is always in the “denominator.”

The dimension compatibility conditions for x = Ab require the two matrices A and b to have the same number of rows. The solution x then has the same number of columns as b and its row dimension is equal to the column dimension of A. For x = b/A, the roles of rows and columns are interchanged.

In practice, linear equations of the form Ax = b occur more frequently than those of the form xA = b. Consequently, the backslash is used far more frequently than the slash. The remainder of this section concentrates on the backslash operator; the corresponding properties of the slash operator can be inferred from the identity:

The coefficient matrix A need not be square. If A has size m-by-n, then there are three cases:

m = n

Square system. Seek an exact solution.

m > n

Overdetermined system, with more equations than unknowns. Find a least-squares solution.

m < n

Underdetermined system, with fewer equations than unknowns. Find a basic solution with at most m nonzero components.

The mldivide Algorithm

The mldivide operator employs different solvers to handle different kinds of coefficient matrices. The various cases are diagnosed automatically by examining the coefficient matrix. For more information, see the “Algorithms” section of the mldivide reference page.

General Solution

The general solution to a system of linear equations Axb describes all possible solutions. You can find the general solution by:

  1. Solving the corresponding homogeneous system Ax = 0. Do this using the null command, by typing null(A). This returns a basis for the solution space to Ax = 0. Any solution is a linear combination of basis vectors.

  2. Finding a particular solution to the nonhomogeneous system Ax =b.

You can then write any solution to Axb as the sum of the particular solution to Ax =b, from step 2, plus a linear combination of the basis vectors from step 1.

The rest of this section describes how to use MATLAB to find a particular solution to Ax =b, as in step 2.

Square Systems

The most common situation involves a square coefficient matrix A and a single right-hand side column vector b.

Nonsingular Coefficient Matrix

If the matrix A is nonsingular, then the solution, x = Ab, is the same size as b. For example:

A = pascal(3);
u = [3; 1; 4];
x = Au

x =
      10
     -12
       5

It can be confirmed that A*x is exactly equal to u.

If A and b are square and the same size, x= Ab is also that size:

b = magic(3);
X = Ab

X =
      19    -3    -1
     -17     4    13
       6     0    -6

It can be confirmed that A*x is exactly equal to b.

Both of these examples have exact, integer solutions. This is because the coefficient matrix was chosen to be pascal(3), which is a full rank matrix (nonsingular).

Singular Coefficient Matrix

A square matrix A is singular if it does not have linearly
independent columns. If A is singular, the solution to
Ax = b either does not exist, or is not unique. The
backslash operator, Ab, issues a warning if A is
nearly singular or if it detects exact singularity.

If A is singular and Ax = b has
a solution, you can find a particular solution that is not unique, by typing

pinv(A) is a pseudoinverse of A. If
Ax = b does not have an exact solution, then
pinv(A) returns a least-squares solution.

For example:

A = [ 1     3     7
     -1     4     4
      1    10    18 ]

is singular, as you can verify by typing

Since A is not full rank, it has some singular values equal to
zero.

Exact Solutions. For b =[5;2;12],
the equation Ax = b has an exact solution, given
by

pinv(A)*b

ans =
    0.3850
   -0.1103
    0.7066

Verify that pinv(A)*b is an exact solution by typing

A*pinv(A)*b

ans =
    5.0000
    2.0000
   12.0000

Least-Squares Solutions. However, if b =
[3;6;0]
, Ax = b does not have an exact
solution. In this case, pinv(A)*b returns a least-squares solution. If
you type

A*pinv(A)*b

ans =
   -1.0000
    4.0000
    2.0000

you do not get back the original vector b.

You can determine whether Ax =b has an exact
solution by finding the row reduced echelon form of the augmented matrix [A
b]
. To do so for this example, enter

rref([A b])
ans =
    1.0000         0    2.2857         0
         0    1.0000    1.5714         0
         0         0         0    1.0000

Since the bottom row contains all zeros except for the last entry, the equation does not
have a solution. In this case, pinv(A) returns a least-squares
solution.

Overdetermined Systems

This example shows how overdetermined systems are often encountered in various kinds of curve fitting to experimental data.

A quantity y is measured at several different values of time t to produce the following observations. You can enter the data and view it in a table with the following statements.

t = [0 .3 .8 1.1 1.6 2.3]';
y = [.82 .72 .63 .60 .55 .50]';
B = table(t,y)
B=6×2 table
     t      y  
    ___    ____

      0    0.82
    0.3    0.72
    0.8    0.63
    1.1     0.6
    1.6    0.55
    2.3     0.5

Try modeling the data with a decaying exponential function

y(t)=c1+c2e-t.

The preceding equation says that the vector y should be approximated by a linear combination of two other vectors. One is a constant vector containing all ones and the other is the vector with components exp(-t). The unknown coefficients, c1 and c2, can be computed by doing a least-squares fit, which minimizes the sum of the squares of the deviations of the data from the model. There are six equations in two unknowns, represented by a 6-by-2 matrix.

E = [ones(size(t)) exp(-t)]
E = 6×2

    1.0000    1.0000
    1.0000    0.7408
    1.0000    0.4493
    1.0000    0.3329
    1.0000    0.2019
    1.0000    0.1003

Use the backslash operator to get the least-squares solution.

In other words, the least-squares fit to the data is

y(t)=0.4760+0.3413e-t.

The following statements evaluate the model at regularly spaced increments in t, and then plot the result together with the original data:

T = (0:0.1:2.5)';
Y = [ones(size(T)) exp(-T)]*c;
plot(T,Y,'-',t,y,'o')

Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers

E*c is not exactly equal to y, but the difference might well be less than measurement errors in the original data.

A rectangular matrix A is rank deficient if it does not have linearly independent columns. If A is rank deficient, then the least-squares solution to AX = B is not unique. AB issues a warning if A is rank deficient and produces a least-squares solution. You can use lsqminnorm to find the solution X that has the minimum norm among all solutions.

Underdetermined Systems

This example shows how the solution to underdetermined systems is not unique. Underdetermined linear systems involve more unknowns than equations. The matrix left division operation in MATLAB finds a basic least-squares solution, which has at most m nonzero components for an m-by-n coefficient matrix.

Here is a small, random example:

R = [6 8 7 3; 3 5 4 1]
rng(0);
b = randi(8,2,1)
R =

       6              8              7              3       
       3              5              4              1       


b =

       7       
       8      

The linear system Rp = b involves two equations in four unknowns. Since the coefficient matrix contains small integers, it is appropriate to use the format command to display the solution in rational format. The particular solution is obtained with

One of the nonzero components is p(2) because R(:,2) is the column of R with largest norm. The other nonzero component is p(4) because R(:,4) dominates after R(:,2) is eliminated.

The complete general solution to the underdetermined system can be characterized by adding p to an arbitrary linear combination of the null space vectors, which can be found using the null function with an option requesting a rational basis.

Z =

      -1/2           -7/6     
      -1/2            1/2     
       1              0       
       0              1       

It can be confirmed that R*Z is zero and that the residual R*x - b is small for any vector x, where

Since the columns of Z are the null space vectors, the product Z*q is a linear combination of those vectors:

To illustrate, choose an arbitrary q and construct x.

q = [-2; 1];
x = p + Z*q;

Calculate the norm of the residual.

format short
norm(R*x - b)

When infinitely many solutions are available, the solution with minimum norm is of particular interest. You can use lsqminnorm to compute the minimum-norm least-squares solution. This solution has the smallest possible value for norm(p).

p =

    -207/137   
     365/137   
      79/137   
    -424/137  

Solving for Several Right-Hand Sides

Some problems are concerned with solving linear systems that have the same coefficient matrix A, but different right-hand sides b. When the different values of b are available at the same time, you can construct b as a matrix with several columns and solve all of the systems of equations at the same time using a single backslash command: X = A[b1 b2 b3 …].

However, sometimes the different values of b are not all available at the same time, which means you need to solve several systems of equations consecutively. When you solve one of these systems of equations using slash (/) or backslash (), the operator factorizes the coefficient matrix A and uses this matrix decomposition to compute the solution. However, each subsequent time you solve a similar system of equations with a different b, the operator computes the same decomposition of A, which is a redundant computation.

The solution to this problem is to precompute the decomposition of A, and then reuse the factors to solve for the different values of b. In practice, however, precomputing the decomposition in this manner can be difficult since you need to know which decomposition to compute (LU, LDL, Cholesky, and so on) as well as how to multiply the factors to solve the problem. For example, with LU decomposition you need to solve two linear systems to solve the original system Ax = b:

[L,U] = lu(A);
x = U  (L  b);

Instead, the recommended method for solving linear systems with several consecutive right-hand sides is to use decomposition objects. These objects enable you to leverage the performance benefits of precomputing the matrix decomposition, but they do not require knowledge of how to use the matrix factors. You can replace the previous LU decomposition with:

dA = decomposition(A,'lu');
x = dAb;

If you are unsure which decomposition to use, decomposition(A) chooses the correct type based on the properties of A, similar to what backslash does.

Here is a simple test of the possible performance benefits of this approach. The test solves the same sparse linear system 100 times using both backslash () and decomposition.

n = 1e3;
A = sprand(n,n,0.2) + speye(n);
b = ones(n,1);

% Backslash solution
tic
for k = 1:100
    x = Ab;
end
toc
Elapsed time is 9.006156 seconds.
% decomposition solution
tic
dA = decomposition(A);
for k = 1:100
    x = dAb;
end
toc
Elapsed time is 0.374347 seconds.

For this problem, the decomposition solution is much faster than using backslash alone, yet the syntax remains simple.

Iterative Methods

If the coefficient matrix A is large and sparse, factorization methods are generally not efficient. Iterative methods generate a series of approximate solutions. MATLAB provides several iterative methods to handle large, sparse input matrices.

Function Description
pcg

Preconditioned conjugate gradients method. This method is appropriate for Hermitian positive definite coefficient matrix A.

bicg

BiConjugate Gradients Method

bicgstab

BiConjugate Gradients Stabilized Method

bicgstabl

BiCGStab(l) Method

cgs

Conjugate Gradients Squared Method

gmres

Generalized Minimum Residual Method

lsqr

LSQR Method

minres

Minimum Residual Method. This method is appropriate for Hermitian coefficient matrix A.

qmr

Quasi-Minimal Residual Method

symmlq

Symmetric LQ Method

tfqmr

Transpose-Free QMR Method

Multithreaded Computation

MATLAB supports multithreaded computation for a number of linear algebra and element-wise numerical functions. These functions automatically execute on multiple threads. For a function or expression to execute faster on multiple CPUs, a number of conditions must be true:

  1. The function performs operations that easily partition into sections that execute concurrently. These sections must be able to execute with little communication between processes. They should require few sequential operations.

  2. The data size is large enough so that any advantages of concurrent execution outweigh the time required to partition the data and manage separate execution threads. For example, most functions speed up only when the array contains several thousand elements or more.

  3. The operation is not memory-bound; processing time is not dominated by memory access time. As a general rule, complicated functions speed up more than simple functions.

inv, lscov, linsolve, and mldivide show significant increase in speed on large double-precision arrays (on order of 10,000 elements or more) when multithreading is enabled.

See Also

mldivide | mrdivide | pinv | decomposition | lsqminnorm

Related Topics

  • Matrices in the MATLAB Environment
  • Factorizations
  • Eigenvalues
  • Singular Values

External Websites

  • Matrix Methods of Linear Algebra (MathWorks Teaching Resources)

В среде MATLAB можно решать системы диффуров с начальными условиями, краевые задачи, а также решать дифференциальные уравнения в частных производных с помощью инструмента PDE toolbox.

В данном обзоре речь пойдет лишь о системах дифференциальных уравнений с начальными условиями, то есть о задаче Коши. В англоязычной литературе это называется Initial Value Problem.

Рассмотрим:

  • каким образом записывать системы диффуров
  • как задать начальные условия
  • временной интервал
  • какой получать результат решения для дальнего использования

Решать системы обыкновенных дифференциальных уравнений можно как в MATLAB, так и в Simulink. 

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

Выбор ваш должен зависеть от задачи. Если Вы, например, хотите смоделировать какой-либо объект управления, описываемый системой диффуров, то в данном случае имеет смысл использовать именно Simulink, так как Вам, впоследствии, понадобиться синтез, например, системы управления, и Simulink подойдет здесь как нельзя лучше.

А вот если у Вас, например, есть необходимость решать системы диффуров с большим количеством уравнений и неизвестных, или специфика Вашей задачи требует особой и специальной настройки численного метода, а также если вы хотите использовать решение диффура в составе других скриптов MATLAB, то Вам имеет смысл решать дифференциальные уравнения способом, о котором пойдёт речь в этом обзоре.

Рассмотрим синтаксис решателей matlab.В качестве аргументов следует подать правую часть системы в виде MATLAB-функции.

На рисунке показан требуемый вид системы, когда выражены старшие производные.

Системы, чей вид отличается от требуемого, следует преобразовать к таковому.

Если функция простая, то её можно записать прямо в поле аргумента, однако, когда речь идёт о системах уравнений, имеет смысл записывать систему уравнений в виде отдельной функции, в том числе и в виде отдельного м-файла. Об этом мы поговорим чуть позже и на конкретном примере. 

Также подается интервал времени, на котором будет найдено решение. Интервал задаётся строкой из двух чисел: начальной величины независимого аргумента t и его конечного значения.

Далее задаются начальные условия. Значения всех неизвестных искомых переменных в начале расчёта задаются в виде столбца соответствующей размерности.

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

Вы могли заметить, что название функции — odeXY – это обозначение для всех решателей, которых всего 8 штук. В данном ролике мы пользоваться решателем ode45, соответствующего численному по методу Дормана-Принса 4(5). Этого решателя достаточно для подавляющего большинства задач. Остальные решатели будут подробно рассмотрены в приложении к задачам соответствующих типов позже.

Перейдем к примерам.

Рассмотрим 2 примера:

  • решение дифференциального уравнения первого порядка.
  • решение системы двух дифференциальных уравнений второго порядка.

В качестве уравнение первого порядка рассмотрим логистическое уравнение Ферхюльста, которое описывает динамику численности популяции. Суть уравнения такова: скорость прироста населения y пропорциональна количеству населения, однако лимитирована максимальной численностью популяции.

Забавный факт: Ферхюльст назвал это уравнение логистическим, и никто до сих пор не знает почему, ибо сам Ферхюльст об этом никому не рассказал.

Решение этого дифференциального уравнения выглядит следующим образом.

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

Перейдем в окно MATLABа и посмотрим, как это выглядит.

Так выглядит скрипт:

Так выглядит график решения дифференциального уравнения:

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

Уравнения показаны на рисунке. Но вид системы отличается от требуемого, в том числе потому, что в нём присутствуют вторые производные. Для приведения системы в требуемый вид выполним 2 простых шага:

Первое: следует заменить переменные соответствующим образом. Теперь у нас 4 неизвестных. Далее следует преобразовать уравнение с учетом замены. Таким образом, мы имеем систему из четырёх дифференциальных уравнений первого порядка.

Настало время её записать.

Итак, мы имеем систему, параметры, интервал времени и начальные условия. Решим же эту задачу скорее.

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

Эту функцию можно располагать как в самом скрипте решения в самом его конце, так и в виде отдельного m-файла.

На выходе функция должна представлять собой вектор-столбец, который записывается перечислением компонент через точку запятой как показано на рисунке.

Теперь рассмотрим скрипт самого решения.

На этот раз запишем интервал и начальные условия в виде переменных MATLAB. Интервал, соответственно, в виде строки, а начальные условия – в виде столбца длинной 4.

Сообразно с уже разобранным ранее синтаксисом укажем функцию pendulum_np, интервал времени и начальные условия.

Перейдем теперь в окно MATLAB и посмотрим решение.

Так выглядит скрипт:

Часть 2

Запускаем скрипт и получаем графики:

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

На рисунке показана функция MATLAB, которая соответствует движению подвешенного на пружине шара, однако можно заметить, что эта функция теперь имеет на 5 аргументов больше.

Параметры задаются в скрипте, а при вызове функции мы обращаемся к уже известному оператору-собаке, которая превращает функцию семи переменных pendulum_n в функцию двух переменных t и X. Вот и всё.

Я вам очень рекомендую разобраться с тем, как работает оператор-собака. В хелпе он называется function-handle. Разобравшись с ним Вам будет работать в среде MATLAB ещё проще и ещё приятнее.

Вывод: не так страшно решать диффуры

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

Их можно, с одной стороны, разделить по степени жёсткости, а с другой стороны, по структуре самой системы.

Когда уравнения представляют поведение системы, которая содержит ряд быстрых и медленных реакций, то такую систему уравнения можно назвать жесткой.  Для жестких задач явные численные методы работают плохо, или не работают вовсе. Примером жесткой задачи может являться протекание тока через клеточную мембрану. На самом деле, чёткого разделения между жесткими и нежёсткими системами не существует. Степень жесткости системы формально определяется через собственные значения матрицы Якоби, но давайте не будем закапываться. 

Видеообзор по теме решения систем Д/У доступен по ссылке.  

Solve a system of several ordinary differential equations in several variables by using the dsolve function, with or without initial conditions. To solve a single differential equation, see Solve Differential Equation.

Solve System of Differential Equations

Solve this system of linear first-order differential equations.

dudt=3u+4v,dvdt=-4u+3v.

First, represent u and v by using syms to create the symbolic functions u(t) and v(t).

Define the equations using == and represent differentiation using the diff function.

ode1 = diff(u) == 3*u + 4*v;
ode2 = diff(v) == -4*u + 3*v;
odes = [ode1; ode2]
odes(t) = 

(∂∂t u(t)=3 u(t)+4 v(t)∂∂t v(t)=3 v(t)-4 u(t))

Solve the system using the dsolve function which returns the solutions as elements of a structure.

S = struct with fields:
    v: C1*cos(4*t)*exp(3*t) - C2*sin(4*t)*exp(3*t)
    u: C2*cos(4*t)*exp(3*t) + C1*sin(4*t)*exp(3*t)

If dsolve cannot solve your equation, then try solving the equation numerically. See Solve a Second-Order Differential Equation Numerically.

To access u(t) and v(t), index into the structure S.

uSol(t) = C2 cos(4 t) e3 t+C1 sin(4 t) e3 t
vSol(t) = C1 cos(4 t) e3 t-C2 sin(4 t) e3 t

Alternatively, store u(t) and v(t) directly by providing multiple output arguments.

[uSol(t),vSol(t)] = dsolve(odes)
uSol(t) = C2 cos(4 t) e3 t+C1 sin(4 t) e3 t
vSol(t) = C1 cos(4 t) e3 t-C2 sin(4 t) e3 t

The constants C1 and C2 appear because no conditions are specified. Solve the system with the initial conditions u(0) == 0 and v(0) == 0. The dsolve function finds values for the constants that satisfy these conditions.

cond1 = u(0) == 0;
cond2 = v(0) == 1;
conds = [cond1; cond2];
[uSol(t),vSol(t)] = dsolve(odes,conds)

Visualize the solution using fplot.

fplot(uSol)
hold on
fplot(vSol)
grid on
legend('uSol','vSol','Location','best')

Figure contains an axes object. The axes object contains 2 objects of type functionline. These objects represent uSol, vSol.

Solve Differential Equations in Matrix Form

Solve differential equations in matrix form by using dsolve.

Consider this system of differential equations.

dxdt=x+2y+1,dydt=-x+y+t.

The matrix form of the system is

[x′y′]=[12-11][xy]+[1t].

Let

Y=[xy],A=[12-11],B=[1t].

The system is now Y′=A Y+B..

Define these matrices and the matrix equation.

syms x(t) y(t)
A = [1 2; -1 1];
B = [1; t];
Y = [x; y];
odes = diff(Y) == A*Y + B
odes(t) = 

(∂∂t x(t)=x(t)+2 y(t)+1∂∂t y(t)=t-x(t)+y(t))

Solve the matrix equation using dsolve. Simplify the solution by using the simplify function.

[xSol(t),ySol(t)] = dsolve(odes);
xSol(t) = simplify(xSol(t))
xSol(t) = 

2 t3+2 C2 et cos(2 t)+2 C1 et sin(2 t)+19

ySol(t) = simplify(ySol(t))
ySol(t) = 

C1 et cos(2 t)-t3-C2 et sin(2 t)-29

The constants C1 and C2 appear because no conditions are specified.

Solve the system with the initial conditions u(0)=2 and v(0)=-1. When specifying equations in matrix form, you must specify initial conditions in matrix form too. dsolve finds values for the constants that satisfy these conditions.

C = Y(0) == [2;-1];
[xSol(t),ySol(t)] = dsolve(odes,C)
xSol(t) = 

2 et σ2 17 218+e-t 4 σ1+2 σ2+6 t σ1+6 2 t σ218-2 et σ1 e-t 4 σ2-2 σ1+6 t σ2-6 2 t σ118+79where  σ1=sin(2 t)  σ2=cos(2 t)

ySol(t) = 

-et σ1 17 218+e-t 4 σ1+2 σ2+6 t σ1+6 2 t σ218-et σ2 e-t 4 σ2-2 σ1+6 t σ2-6 2 t σ118+79where  σ1=sin(2 t)  σ2=cos(2 t)

Visualize the solution using fplot.

clf
fplot(ySol)
hold on
fplot(xSol)
grid on
legend('ySol','xSol','Location','best')

Figure contains an axes object. The axes object contains 2 objects of type functionline. These objects represent ySol, xSol.

See Also

Solve Differential Equation

Создать систему уравнений в матлабе

Решение систем линейных уравнений

Метод обратной матрицы: для системы из n уравнений с n неизвестными , при условии что определитель матрицы не равен нулю, единственное решение можно представить в виде . Для того чтобы решить систему линейных уравнений методом обратной матрицы, необходимо выполнить следующие действия:

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

Дана система уравнений:

Решаем на MATLAB :

A=[1 -2 1; 2 -5 -1; -7 0 1];

x=inv(A)*b % Решение системы x = A -1 b

Решение системы линейных уравнений при помощи метода Гаусса основывается на том, что от заданной системы, переходят к системе эквивалентной, которая решается проще, чем исходная.

Метод Гаусса состоит из двух этапов:

  • Первый этап — это прямой ход, в результате которого расширенная матрица системы путем элементарных преобразований (перестановка уравнений системы, умножение уравнений на число, отличное от нуля, и сложение уравнений) приводится к ступенчатому виду.
  • На втором этапе (обратный ход) ступенчатую матрицу преобразуют так, бы в первых n столбцах получилась единичная матрица. Последний, n +1 столбец этой матрицы содержит решение системы линейных уравнений.

Порядок решения задачи в MATLAB следующий:

  • сформировать матрицу коэффициентов и вектор свободных членов заданной системы;
  • сформировать расширенную матрицу системы, объединив и ;
  • используя функцию rref, привести расширенную матрицу к ступенчатому виду;
  • найти решение системы, выделив последний столбец матрицы, полученной в предыдущем пункте;
  • выполнить вычисление ; если в результате получился нулевой вектор, задача решена верно.

A=[1 -2 1; 2 -5 -1; -7 0 1];

C=rref ([A b]); %Приведение расширенной матрицы к треугольному виду

x=C(1:3,4:4) %Выделение последнего столбца из матрицы

Решение СЛАУ и матрицы в Matlab

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

Также стоит отметить, что у каждого алгоритма, которым мы будем искать решение СЛАУ в Matlab, своя скорость нахождения этого решения, наличие или отсутствие условия выполнения алгоритма и т.д.

В традициях нашего сайта разберём на примере:

Решить систему линейных уравнений:

4*a + b — c = 6
a — b + c = 4
2*a — 3*b — 3*c = 4

Метод обратной матрицы в Matlab

Начнем с достаточно распространенного метода. Его суть состоит в том, что сначала необходимо выписать коэффициенты при a, b и c (то есть те коэффициенты, которые находятся слева) в одну матрицу, а свободный член (то есть то, что справа) в другую.

В итоге у нас получится 2 матрицы:

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

После проверки условия можем перейти к следующему шагу: нахождение обратной матрицы. В Matlab для этого используется оператор inv .
А само решение СЛАУ в Matlab находится как перемножение найденной обратной матрицы на матрицу свободных членов:

Мы получили 3 значения, которые и соответствуют нашим коэффициентам: то есть a = 2, b = -1, c = 1 . Можете проверить, подставив полученные ответы в исходную систему, и убедиться, что мы решили СЛАУ правильно.

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

Если вы не все поняли, то советую вам почитать нашу статью по основам Matlab.

Метод Гаусса

Метод Гаусса в Matlab реализуется достаточно просто: для этого нам нужно всего лишь изучить один новый оператор.
() — левое деление.
При следующей записи:

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

Метод разложения матрицы

Теперь поговорим о разложении матрицы. Нахождение решения через разложение матрицы очень эффективно. Эффективность обусловлена скоростью нахождения решения для данного вида систем и точностью полученных результатов.

Возможны следующие разложения:

  • разложение Холецкого
  • LU разложение
  • QR разложение

Разберём решение через LU и QR разложение, так как в задачах чаще всего встречается задание на решение именно через такие разложения.

Основное отличие этих двух разложений: LU разложение применимо только для квадратных матриц, QR — возможно и для прямоугольных.

LU разложение

Решим выше предложенную задачу через LU разложение:

QR разложение

И через QR разложение соответственно:

Отметим, что апостроф ( ) после Q означает транспонирование.

Стандартные функции Matlab

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

Как видите, ничего сложного тут нет, на то они и стандартные функции Matlab.

Повторение

Итак, сегодня мы с вами изучили несколько методов для решения СЛАУ в Matlab, как с помощью матриц, так и с помощью стандартных функций. Давайте их повторим на другом примере:

Решить систему линейных уравнений:
6*a — b — c = 0
a — 2*b + 3*d = 0
3*a — 4*b — 4*c = -1

  • Методом обратной матрицы:
  • Методом Гаусса:
  • LU разложение:
  • QR разложение:

На этом я с вами попрощаюсь, надеюсь, вы научились применять матрицы в Matlab для решения СЛАУ.

MATLAB — алгебра

До сих пор мы видели, что все примеры работают как в MATLAB, так и в его GNU, альтернативно называемом Octave. Но для решения основных алгебраических уравнений и MATLAB, и Octave немного отличаются, поэтому мы постараемся охватить MATLAB и Octave в отдельных разделах.

Мы также обсудим факторизацию и упрощение алгебраических выражений.

Решение основных алгебраических уравнений в MATLAB

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

Например, давайте решим для х в уравнении х-5 = 0

MATLAB выполнит приведенный выше оператор и вернет следующий результат —

Вы также можете вызвать функцию решения как —

MATLAB выполнит приведенный выше оператор и вернет следующий результат —

Вы можете даже не включать правую часть уравнения —

MATLAB выполнит приведенный выше оператор и вернет следующий результат —

Если в уравнение входит несколько символов, то по умолчанию MATLAB предполагает, что вы решаете для x, однако функция решения имеет другую форму —

где вы также можете упомянуть переменную.

Например, давайте решим уравнение v — u — 3t 2 = 0, для v. В этом случае мы должны написать —

MATLAB выполнит приведенный выше оператор и вернет следующий результат —

Решение основных алгебраических уравнений в октаве

Функция корней используется для решения алгебраических уравнений в Octave, и вы можете написать приведенные выше примеры следующим образом:

Например, давайте решим для х в уравнении х-5 = 0

Octave выполнит приведенный выше оператор и вернет следующий результат —

Вы также можете вызвать функцию решения как —

Octave выполнит приведенный выше оператор и вернет следующий результат —

Решение квадратичных уравнений в MATLAB

Функция решения также может решать уравнения более высокого порядка. Он часто используется для решения квадратных уравнений. Функция возвращает корни уравнения в массиве.

В следующем примере решается квадратное уравнение x 2 -7x +12 = 0. Создайте файл сценария и введите следующий код —

Когда вы запускаете файл, он показывает следующий результат —

Решение квадратичных уравнений в октаве

В следующем примере решается квадратное уравнение x 2 -7x +12 = 0 в октаве. Создайте файл сценария и введите следующий код —

Когда вы запускаете файл, он показывает следующий результат —

Решение уравнений высшего порядка в MATLAB

Функция решения также может решать уравнения более высокого порядка. Например, давайте решим кубическое уравнение как (x-3) 2 (x-7) = 0

MATLAB выполнит приведенный выше оператор и вернет следующий результат —

В случае уравнений более высокого порядка корни длинные, содержащие много членов. Вы можете получить числовое значение таких корней, преобразовав их в двойные. В следующем примере решается уравнение четвертого порядка x 4 — 7x 3 + 3x 2 — 5x + 9 = 0.

Создайте файл сценария и введите следующий код —

Когда вы запускаете файл, он возвращает следующий результат —

Обратите внимание, что последние два корня являются комплексными числами.

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

В следующем примере решается уравнение четвертого порядка x 4 — 7x 3 + 3x 2 — 5x + 9 = 0.

Создайте файл сценария и введите следующий код —

Когда вы запускаете файл, он возвращает следующий результат —

Решение системы уравнений в MATLAB

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

Давайте решим уравнения —

Создайте файл сценария и введите следующий код —

Когда вы запускаете файл, он показывает следующий результат —

Таким же образом вы можете решать большие линейные системы. Рассмотрим следующую систему уравнений —

Решающая система уравнений в октаве

У нас есть немного другой подход к решению системы ‘n’ линейных уравнений с ‘n’ неизвестными. Давайте рассмотрим простой пример, чтобы продемонстрировать это использование.

Давайте решим уравнения —

Такая система линейных уравнений может быть записана в виде единого матричного уравнения Ax = b, где A — матрица коэффициентов, b — вектор столбцов, содержащий правую часть линейных уравнений, а x — вектор столбцов, представляющий решение как показано в программе ниже —

Создайте файл сценария и введите следующий код —

Когда вы запускаете файл, он показывает следующий результат —

Таким же образом, вы можете решить большие линейные системы, как указано ниже —

Разложение и сбор уравнений в MATLAB

Функция расширения и сбора расширяет и собирает уравнение соответственно. Следующий пример демонстрирует понятия —

Когда вы работаете со многими символическими функциями, вы должны объявить, что ваши переменные являются символическими.

Создайте файл сценария и введите следующий код —

Когда вы запускаете файл, он показывает следующий результат —

Расширяя и собирая уравнения в октаве

Вам нужно иметь символьный пакет, который обеспечивает расширение и функцию сбора для расширения и сбора уравнения, соответственно. Следующий пример демонстрирует понятия —

Когда вы работаете со многими символическими функциями, вы должны объявить, что ваши переменные являются символическими, но у Octave другой подход к определению символических переменных. Обратите внимание на использование Sin и Cos , которые также определены в символической упаковке.

Создайте файл сценария и введите следующий код —

Когда вы запускаете файл, он показывает следующий результат —

Факторизация и упрощение алгебраических выражений

Факторная функция разлагает выражение, а функция упрощения упрощает выражение. Следующий пример демонстрирует концепцию —

пример

Создайте файл сценария и введите следующий код —

Когда вы запускаете файл, он показывает следующий результат —

источники:

http://codetown.ru/matlab/slau-matricy/

http://coderlessons.com/tutorials/kompiuternoe-programmirovanie/uznaite-matlab/matlab-algebra

До сих пор мы видели, что все примеры работают как в MATLAB, так и в его GNU, альтернативно называемом Octave. Но для решения основных алгебраических уравнений и MATLAB, и Octave немного отличаются, поэтому мы постараемся охватить MATLAB и Octave в отдельных разделах.

Мы также обсудим факторизацию и упрощение алгебраических выражений.

Решение основных алгебраических уравнений в MATLAB

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

Например, давайте решим для х в уравнении х-5 = 0

solve('x-5=0')

MATLAB выполнит приведенный выше оператор и вернет следующий результат –

ans =
   5

Вы также можете вызвать функцию решения как –

y = solve('x-5 = 0')

MATLAB выполнит приведенный выше оператор и вернет следующий результат –

y =
   5

Вы можете даже не включать правую часть уравнения –

solve('x-5')

MATLAB выполнит приведенный выше оператор и вернет следующий результат –

ans =
   5

Если в уравнение входит несколько символов, то по умолчанию MATLAB предполагает, что вы решаете для x, однако функция решения имеет другую форму –

solve(equation, variable)

где вы также можете упомянуть переменную.

Например, давайте решим уравнение v – u – 3t 2 = 0, для v. В этом случае мы должны написать –

solve('v-u-3*t^2=0', 'v')

MATLAB выполнит приведенный выше оператор и вернет следующий результат –

ans =
   3*t^2 + u

Решение основных алгебраических уравнений в октаве

Функция корней используется для решения алгебраических уравнений в Octave, и вы можете написать приведенные выше примеры следующим образом:

Например, давайте решим для х в уравнении х-5 = 0

Live Demo

roots([1, -5])

Octave выполнит приведенный выше оператор и вернет следующий результат –

ans = 5

Вы также можете вызвать функцию решения как –

Live Demo

y = roots([1, -5])

Octave выполнит приведенный выше оператор и вернет следующий результат –

y = 5

Решение квадратичных уравнений в MATLAB

Функция решения также может решать уравнения более высокого порядка. Он часто используется для решения квадратных уравнений. Функция возвращает корни уравнения в массиве.

В следующем примере решается квадратное уравнение x 2 -7x +12 = 0. Создайте файл сценария и введите следующий код –

eq = 'x^2 -7*x + 12 = 0';
s = solve(eq);
disp('The first root is: '), disp(s(1));
disp('The second root is: '), disp(s(2));

Когда вы запускаете файл, он показывает следующий результат –

The first root is: 
   3
The second root is: 
   4

Решение квадратичных уравнений в октаве

В следующем примере решается квадратное уравнение x 2 -7x +12 = 0 в октаве. Создайте файл сценария и введите следующий код –

Live Demo

s = roots([1, -7, 12]);

disp('The first root is: '), disp(s(1));
disp('The second root is: '), disp(s(2));

Когда вы запускаете файл, он показывает следующий результат –

The first root is: 
   4
The second root is: 
   3

Решение уравнений высшего порядка в MATLAB

Функция решения также может решать уравнения более высокого порядка. Например, давайте решим кубическое уравнение как (x-3) 2 (x-7) = 0

solve('(x-3)^2*(x-7)=0')

MATLAB выполнит приведенный выше оператор и вернет следующий результат –

ans =
   3
   3
   7

В случае уравнений более высокого порядка корни длинные, содержащие много членов. Вы можете получить числовое значение таких корней, преобразовав их в двойные. В следующем примере решается уравнение четвертого порядка x 4 – 7x 3 + 3x 2 – 5x + 9 = 0.

Создайте файл сценария и введите следующий код –

eq = 'x^4 - 7*x^3 + 3*x^2 - 5*x + 9 = 0';
s = solve(eq);
disp('The first root is: '), disp(s(1));
disp('The second root is: '), disp(s(2));
disp('The third root is: '), disp(s(3));
disp('The fourth root is: '), disp(s(4));

% converting the roots to double type
disp('Numeric value of first root'), disp(double(s(1)));
disp('Numeric value of second root'), disp(double(s(2)));
disp('Numeric value of third root'), disp(double(s(3)));
disp('Numeric value of fourth root'), disp(double(s(4)));

Когда вы запускаете файл, он возвращает следующий результат –

The first root is: 
6.630396332390718431485053218985
 The second root is: 
1.0597804633025896291682772499885
 The third root is: 
- 0.34508839784665403032666523448675 - 1.0778362954630176596831109269793*i
 The fourth root is: 
- 0.34508839784665403032666523448675 + 1.0778362954630176596831109269793*i
Numeric value of first root
   6.6304
Numeric value of second root
   1.0598
Numeric value of third root
   -0.3451 - 1.0778i
Numeric value of fourth root
   -0.3451 + 1.0778i

Обратите внимание, что последние два корня являются комплексными числами.

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

В следующем примере решается уравнение четвертого порядка x 4 – 7x 3 + 3x 2 – 5x + 9 = 0.

Создайте файл сценария и введите следующий код –

Live Demo

v = [1, -7,  3, -5, 9];
s = roots(v);

% converting the roots to double type
disp('Numeric value of first root'), disp(double(s(1)));
disp('Numeric value of second root'), disp(double(s(2)));
disp('Numeric value of third root'), disp(double(s(3)));
disp('Numeric value of fourth root'), disp(double(s(4)));

Когда вы запускаете файл, он возвращает следующий результат –

Numeric value of first root
 6.6304
Numeric value of second root
-0.34509 + 1.07784i
Numeric value of third root
-0.34509 - 1.07784i
Numeric value of fourth root
 1.0598

Решение системы уравнений в MATLAB

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

Давайте решим уравнения –

5x + 9y = 5

3x – 6y = 4

Создайте файл сценария и введите следующий код –

s = solve('5*x + 9*y = 5','3*x - 6*y = 4');
s.x
s.y

Когда вы запускаете файл, он показывает следующий результат –

ans =
   22/19
ans =
   -5/57

Таким же образом вы можете решать большие линейные системы. Рассмотрим следующую систему уравнений –

х + 3й -2z = 5

3x + 5y + 6z = 7

2x + 4y + 3z = 8

Решающая система уравнений в октаве

У нас есть немного другой подход к решению системы ‘n’ линейных уравнений с ‘n’ неизвестными. Давайте рассмотрим простой пример, чтобы продемонстрировать это использование.

Давайте решим уравнения –

5x + 9y = 5

3x – 6y = 4

Такая система линейных уравнений может быть записана в виде единого матричного уравнения Ax = b, где A – матрица коэффициентов, b – вектор столбцов, содержащий правую часть линейных уравнений, а x – вектор столбцов, представляющий решение как показано в программе ниже –

Создайте файл сценария и введите следующий код –

Live Demo

A = [5, 9; 3, -6];
b = [5;4];
A  b

Когда вы запускаете файл, он показывает следующий результат –

ans =

   1.157895
  -0.087719

Таким же образом, вы можете решить большие линейные системы, как указано ниже –

х + 3й -2z = 5

3x + 5y + 6z = 7

2x + 4y + 3z = 8

Разложение и сбор уравнений в MATLAB

Функция расширения и сбора расширяет и собирает уравнение соответственно. Следующий пример демонстрирует понятия –

Когда вы работаете со многими символическими функциями, вы должны объявить, что ваши переменные являются символическими.

Создайте файл сценария и введите следующий код –

syms x   %symbolic variable x
syms y   %symbolic variable x
% expanding equations
expand((x-5)*(x+9))
expand((x+2)*(x-3)*(x-5)*(x+7))
expand(sin(2*x))
expand(cos(x+y))
 
% collecting equations
collect(x^3 *(x-7))
collect(x^4*(x-3)*(x-5))

Когда вы запускаете файл, он показывает следующий результат –

ans =
   x^2 + 4*x - 45
ans =
   x^4 + x^3 - 43*x^2 + 23*x + 210
ans =
   2*cos(x)*sin(x)
ans =
   cos(x)*cos(y) - sin(x)*sin(y)
ans =
   x^4 - 7*x^3
ans =
   x^6 - 8*x^5 + 15*x^4

Расширяя и собирая уравнения в октаве

Вам нужно иметь символьный пакет, который обеспечивает расширение и функцию сбора для расширения и сбора уравнения, соответственно. Следующий пример демонстрирует понятия –

Когда вы работаете со многими символическими функциями, вы должны объявить, что ваши переменные являются символическими, но у Octave другой подход к определению символических переменных. Обратите внимание на использование Sin и Cos , которые также определены в символической упаковке.

Создайте файл сценария и введите следующий код –

% first of all load the package, make sure its installed.
pkg load symbolic

% make symbols module available
symbols

% define symbolic variables
x = sym ('x');
y = sym ('y');
z = sym ('z');

% expanding equations
expand((x-5)*(x+9))
expand((x+2)*(x-3)*(x-5)*(x+7))
expand(Sin(2*x))
expand(Cos(x+y))
 
% collecting equations
collect(x^3 *(x-7), z)
collect(x^4*(x-3)*(x-5), z)

Когда вы запускаете файл, он показывает следующий результат –

ans =

-45.0+x^2+(4.0)*x
ans =

210.0+x^4-(43.0)*x^2+x^3+(23.0)*x
ans =

sin((2.0)*x)
ans =

cos(y+x)
ans =

x^(3.0)*(-7.0+x)
ans =

(-3.0+x)*x^(4.0)*(-5.0+x)

Факторизация и упрощение алгебраических выражений

Факторная функция разлагает выражение, а функция упрощения упрощает выражение. Следующий пример демонстрирует концепцию –

пример

Создайте файл сценария и введите следующий код –

syms x
syms y
factor(x^3 - y^3)
factor([x^2-y^2,x^3+y^3])
simplify((x^4-16)/(x^2-4))

Когда вы запускаете файл, он показывает следующий результат –

Понравилась статья? Поделить с друзьями:
  • Как исправить пинг в кс го через консоль
  • Как найти все свои аккаунты в инстаграме
  • Как найти крест по фото
  • Как найти ютуб канал если забыл
  • Set user settings to driver failed windows 10 как исправить lenovo