Матлаб как найти угол между векторами

There are a lot of options:

a1 = atan2(norm(cross(v1,v2)), dot(v1,v2))
a2 = acos(dot(v1, v2) / (norm(v1) * norm(v2)))
a3 = acos(dot(v1 / norm(v1), v2 / norm(v2)))
a4 = subspace(v1,v2)

All formulas from this mathworks thread. It is said that a3 is the most stable, but I don’t know why.

For multiple vectors stored on the columns of a matrix, one can calculate the angles using this code:

% Calculate the angle between V (d,N) and v1 (d,1)
% d = dimensions. N = number of vectors
% atan2(norm(cross(V,v2)), dot(V,v2))
c = bsxfun(@cross,V,v2);
d = sum(bsxfun(@times,V,v2),1);%dot
angles = atan2(sqrt(sum(c.^2,1)),d)*180/pi;

Pierre-Pascal

So why doesn’t matlab give us a function for that instead of having us look endlessly on forums?


James Tursa

This topic has been discussed many times on the Newsgroup forum … if I looked hard enough I’m sure I could find several Roger Stafford posts from many years ago on this. E.g., here is one of them:

The basic acos formula is known to be inaccurate for small angles. A more robust method is to use both the sin and cos of the angle via the cross and dot functions. E.g.,

atan2(norm(cross(u,v)),dot(u,v));

An extreme case to clearly show the difference:

>> a = 1e-10

a =

1e-10

>> u = 4*[1 0 0]

u =

4 0 0

>> v = 5*[cos(a) sin(a) 0]

v =

5 5e-10 0

>> acos(dot(u,v)/(norm(u)*norm(v)))

ans =

0

>> atan2(norm(cross(u,v)),dot(u,v))

ans =

1e-10


Gabor Bekes

This does the same thing, also capable of determining the angle of higher (than one) dimensional subspaces.

subspace(vector1,vector2)


Daniel Vasilaky

will give you the same answer.


Boris Povazay

Just a note on how to vectorize the whole thing: (semicolons purposely omitted to see the intermediate results)

u = [1 2 0];

v = [1 0 0];

C=cross(u,v)

NC=norm(C)

D=dot(u,v)

ThetaInDegrees = atan2d(NC,D)

Rep=5

uf = repmat(u,5,1)

vf = repmat(v,5,1)

vC=cross(uf,vf,2)

vNC=vecnorm(vC,2,2)

vD=dot(uf,vf,2)

vThetaInDegrees = mean(atan2d(vNC,vD))

or in short (the hard to read variant)

VThetaInDegrees =atan2d( vecnorm(cross(Vu,Vv,2),2,2) , dot(Vu,Vv,2) )


theodore panagos

Coordinates of two vectors xb,yb and xa,ya .

angle(vector.b,vector.a)=pi/2*((1+sgn(xa))*(1-sgn(ya^2))-(1+sgn(xb))*(1-sgn(yb^2)))

+pi/4*((2+sgn(xa))*sgn(ya)-(2+sgn(xb))*sgn(yb))

+sgn(xa*ya)*atan((abs(xa)-abs(ya))/(abs(xa)+abs(ya)))

-sgn(xb*yb)*atan((abs(xb)-abs(yb))/(abs(xb)+abs(yb)))


Mahaveer Singh

function angle_in_degrees = vector2angle(u,v)

a= sqrt(u(1)^2+u(2)^2+u(3)^2);

b=sqrt(v(1)^2+v(2)^2+v(3)^2);

c=0;

for i=1:1:numel(u)

c=c+u(i)*v(i);

end

angle_in_degrees=acos(c/(a*b))*180/pi

end


Dhritishman

Currently, there is no built-in MATLAB function to calculate the angle between two vectors. However, you can use dot product property of two vectors to find the angle:

cosOfAngle = max(min(dot(u,v)/(norm(u)*norm(v)),1),-1);

angleInDegrees = real(acosd(cosOfAngle));


Darko Kulic

Hi, i would like to update the answer:

angle_deg = rad2deg(angle)

The subspace Function was added 2006a.

I’m sorry if this question seems a really basic, but I cannot find a good answer online yet.

I’m a little confused with vectors and how to use them in matlab. At the moment I have the following three pair of coordinates (x and y): Person 1, The future location of Person 1 and Person 2. See: The three points in a 2d view

Now I want to calculate the angle between «the vector which goes from person 1 to person 2» and «the vector from person 1 to person 1 future». I’ve found some matlab functions which could do this with the vectors, but I am not sure I am actually using the right input for each vector.

So now my question is how can I use these coordinates (and the difference between them) to calculate the angle from the image?

asked Nov 7, 2016 at 9:01

Willems's user avatar

1

Although StefanM’s solution is a pretty common solution to this, it is actually computationally expensive, but most importantly, incorrect when the vectors are tiny and/or the angle is near 0 or π — it can actually result in angles that are slightly negative, or slightly exceed π.

Thus, it gives a false sense of robustness.
I’d instead suggest

theta = acos(min(1,max(-1, a(:).' * b(:) / norm(a) / norm(b) )));

More robust, more correct, over 10× faster when run in a loop, and understandable by laymen without documentation, because it still agrees mostly with the «classical» formula.

answered Nov 7, 2016 at 14:53

Rody Oldenhuis's user avatar

Rody OldenhuisRody Oldenhuis

37.7k7 gold badges49 silver badges96 bronze badges

I would suggest using a property of the dot product of two vectors. For clarity, I explained the details about the Math as well. Just skip it if you already know it.
The following equation explains that property.

u · v = |u||v| cos θ

Source:
http://chortle.ccsu.edu/VectorLessons/vch07/vch07_8.html

Math details

The left-hand side is the dot product. In the 2D case, u = [u1; u2] and v = [v1; v2]. The dot product is then multiplying the elements of each dimension and then summing. In this case thus u · v = u1*v1 + u2*v2.

On the right-hand side, the norms of both vectors are multiplied. A (Euclidean) norm of a 2D vector is described as (x1^2 + x2^2)^(1/2) for a vector x.

Code

Now we discuss the Matlab code. We need a function which outputs theta with inputs of the two vectors.

function theta = calcAngleBetweenVectors(u, v)

dotUV = dot(u, v);
normU = norm(u);
normV = norm(v);

theta = acos(dotUV/(normU * normV));

To improve your function you should check for valid inputs. In this case these must be 2D vectors, although the function works for 2D as well.

Edit: Thank you Ander Biguri for pointing out the error in the dot product. I don’t know what I was thinking

answered Nov 7, 2016 at 9:53

pvl's user avatar

pvlpvl

1841 silver badge10 bronze badges

2

The Matlab Central gives following answer to your problem:

 theta = atan2(norm(cross(a,b)),dot(a,b));

Where a and b are the vectors obtained by subtracting the positions.

answered Nov 7, 2016 at 9:35

StefanM's user avatar

StefanMStefanM

7971 gold badge10 silver badges17 bronze badges

2

Let’s call the points like this:
(x1,y1)- person 1,
(x2,y2)- future person 1,
(x3,y3)- person2.

First_vec_angle=atan((y2-y1)/(x2-x1));
Second_vec_angle=atan((y3-y1)/(x3-x1));

Angle=Second_vec_angle-First_vec_angle;

answered Nov 7, 2016 at 9:39

Adiel's user avatar

AdielAdiel

3,07114 silver badges21 bronze badges

Coordinates of person 1,(x1,y1)-future person 1 ,(x11,y11)-person 2(x2,y2).

Consider x11-x1=xa and y11-y1=ya then x2-x1=xb and y2-y1=yb.

Angle(vector.a,vector.b)=pi()/2*((1+sign(xa))(1-sign(ya^2))-(1+sign(xb))(1-sign(yb^2)))

                    +pi()/4*((2+sign(xa))*sign(ya)-(2+sign(xb))*sign(yb))

                    +sign(xa*ya)*atan((abs(xa)-abs(ya))/(abs(xa)+abs(ya)))

                    -sign(xb*yb)*atan((abs(xb)-abs(yb))/(abs(xb)+abs(yb)))

The formula gives angles from 0 to 2pi,for any value of xa,ya,xb and yb.

For xa=ya=0 and or xb=yb=0 the result is undefined.

answered Nov 13, 2018 at 0:48

theodore panagos's user avatar

Определение взаимного угла в Matlab/Simulink

Определение взаимного угла в Matlab/Simulink

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

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

Рис.1. Взаимный угол между векторами

Способ №1. Определение взаимного угла из разности значений собственных углов векторов

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

где — собственный угол первого и второго вектора

В случае если полученное значение взаимного угла отрицательное , то второй вектор отстает от первого вектора, если полученное значение взаимного угла положительное , то второй вектор опережает первый вектор.

Следует отметить, что полученный угол имеет область значений, которая ограничивается «плавающим» интервалом с периодом изменения сигнала (в качестве примера, угол может меняться в диапазоне от -150 градусов до +220 градусов). Для решения данной проблемы необходимо дополнительно добавить два условия, которые изменяют переменную при достижении границ диапазона :

Если , то ;

Если , то .

Описанный выше алгоритм легко реализуется в программном обеспечении Matlab/Simulink.

Рис.2. Реализация в программном обеспечении Matlab/Simulink

Для преобразования аналогового сигнала в вектор используется блок «Fourier», который из периодического сигнала определяет амплитуду и фазу. В качестве блока, который позволяет выбрать необходимое значение взаимного угла используется ключ «Switch» на вход которого поступает логический сигнал «0» или «1». В зависимости от поступающего логического сигнала выбирается одно из двух значений взаимного угла.

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

Способ №2 Определение взаимного угла из выражения для определения скалярного произведения векторов

Рассмотрим более сложный способ определения взаимного угла между векторами с использованием выражения для определения скалярного произведения векторов:

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

— модули соответствующих векторов, которые вычисляются через арифметический квадратный корень из суммы квадратов координат вектора.

В результате угол между векторами определяется через арккосинус отношения скалярного произведения к произведению модулей векторов.

Однако следует отметить, что функция арккосинус имеет область значений, которая ограничивается интервалом , поэтому невозможно определить расположение векторов в пространстве: отставание или опережение одного вектора от другого. Для решения данной проблемы необходимо к последнему выражению добавить множитель, который принимает значения «1» или «-1» в зависимости от выполнения определенных условий:

Если и или и , то коэффициент равен «1»;

Если и или и , то коэффициент равен «-1» .

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

Рассмотрим реализацию рассмотренного выше алгоритма определения взаимного угла между векторами в программном обеспечении Matlab/Simulink.

Рис.3. Реализация в программном обеспечении Matlab/Simulink

Для преобразования аналогового сигнала в вектор используется блок «Fourier», который из периодического сигнала определяет амплитуду и фазу. Также имеется возможность преобразовать вектор через вещественные и мнимые составляющие с помощью использования блока «Magnitude-Angle to Complex» и блока «Complex to Real-Imag».

Рис.4. А лгоритм определения вещественной и мнимой составляющей комплексного числа из аналогового сигнала

Взаимный угол между двумя рассматриваемыми векторами определяется с помощью использования математических блок-элементов в программном обеспечении Matlab/Simulink.

В качестве блока, который позволяет выбрать значение между положительным и отрицательным числом, используется ключ «Switch» на вход которого поступает логический сигнал «0» или «1». В зависимости от поступающего логического сигнала выбирается одно из двух значений взаимного угла.

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

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

Угол между двумя векторами matlab

Я хочу вычислить угол между 2 векторами V = [Vx Vy Vz] и B = [Bx By Bz] . верна ли эта формула?

и есть ли другой способ его вычислить?

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

5 ответов

Какой самый эффективный способ в языке программирования R вычислить угол между двумя векторами?

Я пытаюсь определить, является ли движение двух объектов in phase или противоположным друг другу. Итак, в основном у меня есть два вектора, R1, R2 в R^3, и я хочу знать, являются ли они point in the same direction. Я могу придумать два способа вычислить это: а) вычислите угол между двумя.

Основываясь на этой ссылке , это кажется наиболее стабильным решением:

Есть много вариантов:

Все формулы из этого потока mathworks . Говорят, что a3 является самым стабильным, но я не знаю, почему.

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

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

Кроме того, как упоминалось в комментариях, matlab имеет функцию dot для непосредственного вычисления внутренних продуктов.

Кроме того, формула такова, какова она есть, поэтому то, что вы делаете, правильно.

Эта функция должна возвращать угол в радианах.

Решение Денниса Джахеруддина отлично подходит для векторов 3D, для векторов более высокой размерности я бы предложил использовать:

Это устраняет числовые проблемы, которые могут привести аргумент acos чуть выше 1 или ниже -1. Однако это все еще проблематично, когда один из векторов является null-вектором. Этот метод также требует только 3*N+1 умножений и 1 sqrt. Это, однако, также требует 2 сравнений, в которых метод atan не нуждается.

Похожие вопросы:

Я прочитал некоторые дубликаты ответов об угле между двумя векторами, но я все еще застрял со своей проблемой. У меня есть два вектора, и я хочу, чтобы угол между ними всегда составлял be 90.

Мне нужно измерить угол между двумя векторами. У меня есть файл .kml , который заполнен Latitutes и longitutes 54.90627884784906, 23.98023512082725 54.90568158443394, 23.98021489919758.

У меня есть два вектора 3D, называемые A и B, которые оба имеют только позицию 3D. Я знаю, как найти угол вдоль единичной окружности в диапазоне от 0-360 градусов с помощью функции atan2, выполнив.

Какой самый эффективный способ в языке программирования R вычислить угол между двумя векторами?

Я пытаюсь определить, является ли движение двух объектов in phase или противоположным друг другу. Итак, в основном у меня есть два вектора, R1, R2 в R^3, и я хочу знать, являются ли они point in the.

У меня есть два пункта, a и b . Мне нужно вычислить угол между ними, поэтому я рассматриваю их как векторы. Однако вектор a всегда будет определяться как [0 0 0]. Читая через диктофон MATLAB угол.

Интересно, почему угол между двумя векторами равен alpha , а не beta или 2*pi — alpha , как показано на рисунке ниже: Угол между двумя векторами http:/ / img202.imageshack.us /.

Я пытаюсь вычислить угол между двумя векторами. Я пробовал это, но он всегда возвращает ноль: public double GetAngle(Vector2 a, Vector2 b) < double angle = Math.Atan2(b.Y, b.X) — Math.Atan2(a.Y.

Мне очень жаль, если этот вопрос кажется действительно простым, но я пока не могу найти хорошего ответа в интернете. Я немного запутался в векторах и в том, как их использовать в matlab. На данный.

Я знаю, как вычислить угол между двумя векторами, как предложил здесь угол между двумя векторами matlab , однако что мне нужно сделать, чтобы получить степень только в одном измерении? Так что я.

Smnggeophysics

Угол между двумя векторами matlab

  • Главная 
  • Угол между двумя векторами matlab

Определение угла между двумя векторами

Я хочу рассчитать угол между двумя векторами V = [Vx Vy Vz] а также B = [Bx By Bz] . эта формула верна?

и есть ли другой способ его вычислить?

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

  • 1 Кажется, это скорее вопрос математики, чем вопрос программирования.
  • 1 В зависимости от вашего языка вы должны добавить круглые скобки, чтобы убедиться, что продукт оценивается до разделения. Если оценивать слева направо, это было бы неправильно.

Судя по этой ссылке, это кажется наиболее стабильным решением:

  • 1 Вот почему я запутался и не знаю, какой из них правильный и почему
  • 2 Прочтите больше по предоставленной мной ссылке. Оба они верны в теории, но на практике этот вариант упоминается для обеспечения более стабильных результатов (в то время как альтернатива с acos вычисляет немного быстрее).

Вариантов очень много:

Все формулы из этой ветки mathworks. Говорят, что а3 самая стабильная, но я не знаю почему.

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

Вы можете вычислить VdotB намного быстрее и для векторов произвольной длины с помощью оператора точки, а именно:

Кроме того, как упоминалось в комментариях, в Matlab есть функция точки для прямого вычисления внутренних продуктов.

Кроме того, формула такова, что вы делаете правильно.

  • 4 Если вы хотите быть лаконичным, по крайней мере рекомендую V*B’
  • 1 Есть ли причина, по которой вы избегаете внутреннего dot функция?
  • @HighPerformanceMark Не говоря уже о том, чтобы забыть о его существовании.
  • нет, нет причин, и функция точки работает очень хорошо, но я просто написал такой вопрос.

Эта функция должна возвращать угол в радианах.

Решение Денниса Джахеруддина отлично подходит для трехмерных векторов, для векторов более высокой размерности я бы предложил использовать:

Это исправляет числовые проблемы, из-за которых аргумент acos может быть чуть выше 1 или ниже -1. Однако все еще проблематично, когда один из векторов является нулевым вектором. Этот метод также требует всего 3 * N + 1 умножения и 1 sqrt. Однако для этого также требуются 2 сравнения, в которых метод atan не требуется.

источники:

http://coderoad.ru/18330451/%D0%A3%D0%B3%D0%BE%D0%BB-%D0%BC%D0%B5%D0%B6%D0%B4%D1%83-%D0%B4%D0%B2%D1%83%D0%BC%D1%8F-%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0%D0%BC%D0%B8-matlab

http://ru.smnggeophysics.com/554128-angle-between-two-vectors-matlab-FYGNHG

Глава 4. Элементы матричной алгебры

вительного в этом ничего нет, поскольку для любой квадратной матрицы ˆ

A

(

)

(

)

ˆ

2

+

ˆ

2

ˆ

имеет место тождество sin(A)

cos(A)

= E.

На заметку

Операции SinM(A)^2 и CosM(A)^2 имеют смысл, поскольку SinM(A) и CosM(A) – квадратные матрицы, и к ним, как к обычным матрицам, применим оператор ^ возведения в целочисленную степень.

Результат вычислений показан в документе на рис. 4.25.

Рис. 4.25. Вычисление матричного синуса и косинуса

Справедливости ради следует отметить, что приведенный способ вычисления матричного синуса и косинуса далеко не единственный. Существуют и более простые пути. Например, можно воспользоваться формулой Эйлера для экспоненты в комплексной степени: exp(ix) = cos(x) + i sin(x), где i — мнимая единица, для которой по определению i2 = −1 . Таким образом, cos(x) = Re(exp(ix)) и sin(x) = Im(exp(ix)) . Здесь через Re(z)

и Im(z) обозначены соответственно действительная и мнимая части комплексного числа z . Мы могли бы, например, определить матричный синус

181

Самоучитель Matlab

как ˆ = ˆ , а матричный косинус как ˆ = ˆ . sin(A) Im(exp(iA)) cos(A) Re(exp(iA))

Примеры таких вычислений приведены ниже:

>>real(expm(A*i)) ans =

0.1750 -0.5752 -0.4314 -0.6878

>>imag(expm(A*i)) ans =

0.6878 -0.5752 -0.4314 -0.1750

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

На заметку

В вычислениях использовалась встроенная функция expm() для расчета матричной экспоненты. Она справляется с задачей, даже если аргумент комплексный. Действительная часть вычисляется с помощью функции real(), а мнимая – с помощью функции imag().

Окно с результатами вычислений показано на рис. 4.26.

Рис. 4.26. Альтернативный способ вычисления матричного синуса и косинуса

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

= ( , , ), индекс k = 1,2, 3 . Предполагаем также, что эти векторы ak ak1 ak2 ak 3

линейно-независимы и образуют базис. Задача состоит в том, чтобы разло-

жить по этому базису некоторый известный вектор b = (b1,b2,b3).

182

Глава 4. Элементы матричной алгебры

Выражение «разложить по базису» означает, что необходимо представить

вектор b

в виде линейной комбинации векторов a1

, a2

и a3

. Другими сло-

вами, необходимо найти такие числа x1 , x2 и x3 , чтобы имело место равен-

3

ство b = xkak

= x1a1 + x2a2 + x

3a3 . Параметры x1 , x2 и x3

называются

k =1

координатами вектора b в базисе из векторов a1 , a2

и a3 . Если компоненты

x

, x

и x

«спрятать» в вектор x

= (x ,x

,x

), то для этого вектора долж-

1

2

3

ˆ

1

2

3

ˆ

но выполняться соотношение x A

= b , где матрица A формируется век-

ˆ

торами a

, a

и a

: первая строка матрицы A

— это вектор a , вторая строка

1

ˆ

2

3

ˆ

1

матрицы A

— вектор a2 , а третья строка матрицы A

— вектор a3 . Другими

ˆ

словами, A — это блочная матрица.

, то чтобы его найти, необходимо в выражении

Что касается вектора x

ˆ

ˆ−1

, обрат-

x

A

= b правую и левую части умножить справа на матрицу A

ˆ

ˆ−1

. Именно этим соотно-

ную к матрице A. В результате получим x

= b

A

шением и воспользуемся для вычисления координат вектора в новом базисе. Рассмотрим приведенный ниже командный код (жирным шрифтом выделен ввод пользователя):

>>a1=[1 3 1];

>>a2=[-2 1 0];

>>a3=[0 -1 2];

>>b=[1 3 -2];

>>A=[a1;a2;a3]

A =

>> x=b/A x =

0.6250 -0.1875 -1.3125 >> x*A

ans =

13 -2

Сначала мы создаем три вектора для нового базиса (значения записываются в переменные a1, a2 и a3), а также вектор (переменная b), который необходимо разложить по базису. Командой A=[a1;a2;a3] на основе векторов нового базиса создается блочная матрица. С помощью этой матрицы, воспользовавшись командой x=b/A, вычисляем вектор координат вектора b в базисе векторов a1, a2 и a3. Проверить, корректно ли вычислен результат, можно, воспользовавшись командой x*A. В результате должны получить вектор b, что, собственно, и происходит (рис. 4.27).

183

Самоучитель Matlab

Рис. 4.27. Вычисление координат вектора в новом базисе

На заметку

Для умножения вектора b справа на обратную матрицу к A мы использовали оператор /. Хотя реальный алгоритм вычисления результата в этом случае на самом деле несколько сложнее, в принципе, можно полагать, что команда b/A вычисляется так: вектор b справа умножается на матрицу, которая обратна к матрице A.

Классической стала задача о вычислении угла между двумя векторами в пространстве. В Matlab эта задача решается исключительно просто. Рас-

смотрим один из возможных способов решения. Базируется он на том об-

щеизвестном факте, что скалярное a

b произведение двух векторов a

и b

равно произведению модулей этих векторов на косинус угла

ϕ между ними,

a

b

то есть a

b

=| a || b | cos(ϕ) . Отсюда легко найти cos(ϕ) =

. Зная

| a || b |

косинус угла, можно вычислить сам угол с помощью функции арккосинуса.

На заметку

В Matlab для вычисления арккосинуса имеется функция acos(). Однако здесь есть один специфический момент. Дело в том, что если известен косинус угла,

184

Глава 4. Элементы матричной алгебры

то сам угол восстанавливается неоднозначно. Арккосинус дет значение в пределах от 0 до p. Поэтому важно четко представлять, что же именно мы вычисляем. В данном случае вычисляется абсолютное значение угла между векторами – в плоскости векторов меньший из двух смежных углов между линиями, вдоль которых направлены векторы.

Пример вычисления угла между векторами представлен в документе на рис. 4.28.

Рис. 4.28. Вычисление угла между векторами

Собственно, для вычисления угла между векторами a и b, помимо команд инициализации векторов, используется всего одна команда phi=180/ pi*acos(dot(a,b)/norm(a)/norm(b)). Угол вычисляется в градусах, поэтому результат, возвращаемый арккосинусом, умножается на 180 и делится на π. Скалярное произведение векторов вычисляем с помощью функции dot(), а модуль вектора вычисляется функцией norm().

Похожая в известном смысле задача – вычисление площади и периметра пространственного треугольника. Задача формулируется так. Заданы три точки в пространстве. Они образуют треугольник. Необходимо найти площадь этого треугольника и его периметр.

Решать задачу будем следующим образом. Обозначим через A, B

и C

точки, которые заданы. На их основе вычисляем три вектора AB

, AC

и BC . Периметр P может быть вычислен как сумма модулей этих векто-

ров, то есть

P =| AB | + | AC | + | BC |. Площадь треугольника равна

1

S =

| AB || AC | sin(ϕ), где через ϕ обозначен между векторами AB и

2

AC . С другой стороны, если вычислить векторное произведение AB ×AC ,

то результатом будет вектор, и его модуль равен | AB || AC | sin(ϕ), то есть в два раза больше площади треугольника.

185

Самоучитель Matlab

На заметку

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

Ниже приведен командный код, с помощью которого вычисляется площадь и периметр треугольника (жирным шрифтом выделен ввод пользователя).

>>A=[1 2 1];

>>B=[-2 3 -1];

>>C=[1 -1 2];

>>AB=B-A

AB =

-3 1 -2 >> AC=C-A

AC =

0 -3 1 >> BC=C-B

BC =

3 -4 3

>>P=norm(AB)+norm(AC)+norm(BC)

P = 12.7349

>>S=norm(cross(AB,AC))/2

S=

5.3619

Командами A=[1 2 1], B=[-2 3 -1] и C=[1 -1 2] создаются точки – вершины треугольника. Затем с помощью команд AB=B-A, AC=C-A и BC=C-B вычисляются векторы, которые нам нужны для вычисления периметра и площади треугольника. Периметр вычисляем командой

P=norm(AB)+norm(AC)+norm(BC). Площадь вычисляем командой

S=norm(cross(AB,AC))/2, в которой для вычисления векторного произведения использована встроенная функция cross(). Результат вычислений показан на рис. 4.29.

Обращаем внимание, что точки представляются в виде списков из трех элементов. Это позволяет достаточно просто на основании известных точек вычислить соответствующие им векторы.

Еще одной классической является задача о решении системы линейных ал-

гебраических уравнений. В общем случае задача формулируется так. Не-

n

обходимо решить систему уравнений aijxj = bi (индекс i = 1,2,…,n )

j =1

относительно неизвестных x1 , x2 , …, xn при условии, что параметры aij

186

Глава 4. Элементы матричной алгебры

Рис. 4.29. Вычисление периметра и площади треугольника

и bi (индексы i, j = 1,2,…,n ) заданы. Именно этой задачей и займемся. Всякие экзотические случаи, наподобие системы без решений, исследовать не будем. Предполагаем, что у системы уравнений решение есть, и оно единственно.

Исходную систему уравнений удобно представить в матричном виде, вве-

ˆ

(индексы i, j = 1,2,…,n ),

дя в рассмотрение матрицу A с элементами a

и

ij

соответственно (индекс

векторы-столбцы b

и x с элементами b

x

i

i

i = 1,2,…,n ). В этих обозначениях система уравнений может быть записа-

ˆ

−1

ˆ

на в виде Ax

= b . Решение находится элементарно: x = A b . Таким обра-

зом, для решения системы уравнений достаточно знать матрицу коэффици-

ˆ

ентов A и вектор правых частей уравнений b . Данный подход реализован в коде, представленном ниже:

187

Самоучитель Matlab

>> A=[1 2 3;-1 1 2;1 -2 5]

A =

1 2 3 -1 1 2 1 -2 5

>>b=[10;1;4]

b =

10

1

4

>>x=Ab

x =

3

2

1

Матрица коэффициентов задается командой A=[1 2 3;-1 1 2;1 -2 5]. Вектор коэффициентов правых частей задается командой b=[10;1;4]. Таким образом, решается следующая система уравнений:

x1

+ 2x2

+ 3x3 = 10

+ x

+ 2x

=

1

x

1

2

3

x

−2x

+ 5x

=

4

1

2

3

Система имеет единственное решение x1 = 3 , x2 = 2 и x3 = 1. Именно его попытаемся найти. Для этого используем команду x=Ab, в результате чего

иполучаем нужное решение (рис. 4.30).

На заметку

Вместо вычисления обратной матрицы к матрице A и умножения ее (слева) на вектор b мы использовали оператор .

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

вообще может возникнуть. Допустим, мы вместо одного векторного базиса

вводим другой. Единичные орты исходного базиса обозначим как a1 , a2 и a3 .

На заметку

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

Они

единичные и ортогональные, то есть скалярное произведение

= δ

(индексы i, j = 1,2, 3 ). Здесь штрих обозначает транспониро-

aa

j

i

ij

188

Глава 4. Элементы матричной алгебры

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

= j

1,i

вание, а через δ

обозначен символ Кронекера. Орты в новом

=

0,i j

ij

базисе обозначим как b

, b

и b

. Они также ортогональные и единичные,

1

2

3

= δ

(индексы i, j = 1,2, 3 ). Никто

то есть имеет место соотношение b

b

j

i

ij

и ничто не запрещают нам записать новые орты через старые орты. Это бу-

3

дет выглядеть так: bi

= sijaj (индекс i = 1,2, 3 ). Элементы sij с индекса-

j =1

ˆ

, которая называется матрицей пере-

ми i, j = 1,2, 3 формируют матрицу S

хода. У этой матрицы есть ряд интересных свойств. Так, несложно показать, что для матрицы перехода Sˆ′ = Sˆ−1 — то есть транспонированная матрица

равна обратной. Определитель матрицы ˆ (по модулю) равен единице. Для

S

преобразования базиса достаточно задать матрицу перехода ˆ. Все необ-

S

ходимые преобразования вычисляются на основе этой матрицы. Так, если

в старом базисе задан некоторый вектор x , то в новом базисе получим век-

= ˆ

тор y Sx. Это следует непосредственно из способа определения матрицы перехода.

189

Самоучитель Matlab

На заметку

При преобразовании базиса модуль вектора не меняется. В старом бази-

се модуль вектора вычисляется как x

x , а в новом базисе это y

y , где

ˆ

по определению y

= Sx. Поскольку в обоих случаях должны получить одно

ˆ

и то же значение, а также принимая во внимание, что y

′ = x

S, получаем

ˆ ˆ

ˆ

y

y

= x

SSx =

x

x. Отсюда, собственно, и находим, что (через E обозна-

ˆ ˆ

ˆ

ˆ

ˆ−1

.

чена единичная матрица) SS

= E и, следовательно, S′ =

S

Если в старом базисе задана некоторая матрица ˆ, то в новом базисе эта

A

матрица вычисляется как ˆ = ˆˆ ˆ−1.

B SAS

На заметку

Данное правило можно получить исходя из того обстоятельства, что для лю-

ˆ

ˆ

бой матрицы A и вектора x

выражение x Ax является скаляром и не зави-

сит от выбора векторного базиса. Поэтому должно выполняться соотношение

ˆ

ˆ

ˆ

ˆ ˆ ˆ

ˆ

−1

xAx = yBy

= x

SBSx

, что дает A = SBS

или B

= SAS .

Очень часто задача состоит в том, чтобы выполнить преобразование базиса,

при котором некоторая матрица (например, ˆ) принимает наиболее про-

A

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

Задана симметричная матрица ˆ. Необходимо найти матрицу перехода ˆ

A S

такую, чтобы матрица ˆ = ˆˆ ˆ−1 была диагональной.

B SAS

На заметку

К диагональному виду матрицу ˆ можно привести, если все ее собственные

A

числа различны. В противном случае удается свести матрицу к жорданову виду, когда матрица «почти диагональная». Более того, матрица перехода будет удо-

ˆ

ˆ−1

ˆ

влетворять условию S′ = S

, только если матрица A симметрична. Другими

ˆ

словами, если речь идет не просто о матрице S , а именно о матрице перехо-

ˆ

ˆ

да S , то свести к диагональному виду можно только симметричную матрицу A

сразными собственными числами.

ВMatlab есть несколько встроенных функций, с помощью которых может решаться описанная выше задача (или идейно близкая к ней). Здесь остановимся на уже известной функции вычисления собственных чисел eig() и функции выполнения жорданова преобразования jordan(). Функция eig() уже описывалась. Что касается функции jordan(), то ее аргументом указывается исходная, преобразуемая, матрица. В качестве результата возвращается две матрицы. Первая матрица – это матрица, с помощью которой выполняется преобразование (аналог матрицы перехода, но только аналог!). Вторая матрица — диагональная или «почти диагональная» (жор-

190

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