Возможна ли разработка приложения на Octave с GUI? |
Векторная алгебра и аналитическая геометрия
6.1 Векторная алгебра
В геометрии вектором называется всякий направленный отрезок. Учение о действиях над векторами называется векторной алгеброй.
Вектор, началом которого служит точка А, а концом точка В, обозначается или . Если начало и конец вектора совпадают, то отрезок превращается в точку и теряет направление, такой отрезок называют нуль-вектором.
Если вектор задан точками и , то его координаты: . Длина вектора называется также его модулем, обозначается или и вычисляется по формуле:
Формулы
служат для вычисления координат середины отрезка .
Разделить отрезок в заданном отношении λ можно так: , здесь и — координаты точки L, делящей отрезок в отношении .
Напомним, что векторы в Octave задаются путём поэлементного ввода:
>>> a =[1 0 3] % Вектор-строка a = 1 0 3 >>> b = [0; 1; 4] % Вектор-столбец b = 0 1 4
Пример 6.1. Построить вектор .
Решение примера показано на рис. 6.1 . Листинг 6.1 содержит команды Octave, с помощью которых был выполнен рисунок.
clear all; clf; cla; set(gcf, ’Position’, [20, 20, 400, 400]); set(gcf, ’numbertitle’, ’off’) set(gcf, ’name’, ’Vector’) set(gca, ’Position’, [.1, .1, .8, .8]); set(gca, ’xlim’, [0, 10]); set(gca, ’ylim’, [0, 10]); set(gca, ’xtick’, [0: 10]); set(gca, ’ytick’, [0: 10]); grid on; xlabel(’x’); ylabel(’y’); a =[5 7]; L1=line([0, a (1)], [0, a(2)]); set(L1, ’LineWidth’, 3, ’Color’, ’k’); L1_=line([a(1), a(1)], [a(2), a(2)]); set(L1_, ’LineWidth’, 5, ’Color’, ’k’); set(L1_, ’marker’, ’<’, ’markersize’, 16);Листинг 6.1. Построение вектора (пример 6.1).
Пример 6.2. Построить векторы, заданные координатами начала и конца:
Решение примера показано в листинге 6.2 и на рис. 6.2. Обратите внимание, что для изображения вектора была создана специальная функция . Эта функция изображает направленный отрезок в декартовой системе координат и возвращает координаты его середины. В данном случае координаты середины отрезка нужны для нанесения соответствующей надписи, обозначающей вектор на рисунке.
clear all; % Функция рисует направленный отрезок АВ, в качестве результата выдаёт % координаты середины отрезка АВ. function [M]= vector(A,B) x1=A(1); x2=B(1); y1=A(2); y2=B(2); alf =30*pi/180;% Угол в вершине стрелки в радианах L=15; % Деление отрезка в заданном отношении xm=(x1+L*x2)/(1+L); ym=(y1+L*y2)/(1+L); k1=(y2-y1)/( x2-x1); % Угол наклона прямой АВ if (k1==Inf ) | (k1==-inf) % Отрезок перпендикулярен оси Ох % Координаты основания треугольника, образующего стрелку x4=xm-0.2; y4=ym; x3=xm+0.2; y3=ym; elseif k1==0 % Отрезок перпендикулярен оси Оу x4=xm; y4=ym-0.2; x3=xm; y3=ym+0.2; else % Уравнение прямой АВ k1=(y2-y1)/(x2-x1); m1=y1-x1*(y2-y1)/(x2-x1); % Уравнение прямой перпендикулярной АВ k3=-1/k1; m3=1/k1*xm+ym; % Уравнение прямой, проходящей через точку В под углом alf к прямой АВ k2=(-k1*tan(alf))/(tan(alf)*k1-1); m2=y2-k2*x2; % Уравнение прямой, проходящей через точку В под углом -alf к прямой АВ k4=(-k1*tan(-alf))/(tan(-alf)*k1-1); m4=y2-k4*x2; % Координаты основания треугольника, образующего стрелку x4=(m3-m2)/(k2-k3); y4=k2*x4+m2; x3=(m3-m4)/(k4-k3); y3=k3*x3+m3; end; % Изображение прямой АВ line([A(1),B(1)], [A(2), B(2)], ’LineWidth’, 3, ’Color’, ’k’); % Изображение стрелки в точке В patch([x2, x3, x4], [y2, y3, y4], ’k’); % Координаты середины отрезка АВ M(1) =(x1+x2)/2; M(2) =(y1+y2)/2; end; clf; cla; set(gcf, ’Position’, [20, 20, 400, 400]); set(gcf, ’numbertitle’, ’off’); set(gcf, ’name’, ’Vector’); set(gca, ’Position’, [.1, .1, .8, .8]); set(gca, ’xlim’, [0, 10]); set(gca, ’ylim’, [0, 10]); set(gca, ’xtick’, [0: 10]); set(gca, ’ytick’, [0 : 10]); grid on; xlabel(’x’); ylabel(’y’); ma=vector([2, 3], [4, 6]); % Построение вектора a T=text(ma(1)+0.3,ma(2)-0.3, ’a’); set (T, ’FontSize’, 20) mb=vector([9, 7], [6, 5]); % Построение вектора b T=text(mb(1)+0.3,mb(2)-0.3, ’b’); set(T, ’FontSize’, 20) mc=vector([1, 8], [4, 8]); % Построение вектора c T=text(mc(1) +0.3,mc(2)-0.3, ’c’); set(T, ’FontSize’, 20) md=vector([6, 7], [6, 9]); % Построение вектора d T=text(md(1)+0.3,md(2)-0.3, ’d’); set(T, ’FontSize’, 20) mk=vector([8, 4], [8, 1]); % Построение вектора k T=text(mk(1)+0.3,mk(2)-0.3, ’k’); set (T, ’FontSize’, 20) mp=vector([7, 3], [5, 3]); % Построение вектора p T=text(mp(1) +0.3,mp(2)-0.3, ’p’); set(T, ’FontSize’, 20)Листинг 6.2. Построение векторов, функция vector (пример 6.2).
Два ненулевых вектора и равны, если они равнонаправлены и имеют один и тот же модуль. Все нулевые векторы равны. Во всех остальных случаях векторы не равны. Два вектора имеющие равные модули и противоположные направления, называются противоположными . Векторы лежащие на параллельных прямых называются коллинеарными.
Пример 6.3. Сравнить векторы и , , и , и заданные координатами начала и конца: .
Текст файла-сценария представлен в листинге 6.3. При решении примера была создана функция , которая вычисляет длину отрезка XY, заданного координатами точек и . Для изображения векторов использовалась функция , описанная в примере 6.2.
Решение примера показано в конце листинга 6.3 и на рис. 6.3 . По полученным числовым результатам и геометрической интерпретации примера можно сделать вывод, что векторы и равны. Векторы и не равны, хотя у них и одинаковые длины, но направления различны. Векторы и неравны по той же причине, а векторы и равны. Векторы и — противоположные, так как имеют одинаковый модуль и противоположные направления.
function d=dlina(X,Y) % Функция возвращает длину отрезка XY d=sqrt((Y(1)-X(1))^2+(Y(2)-X(2))^2); end; clf; set(gcf, ’Position’, [20, 20, 400, 400]); set(gcf, ’numbertitle’, ’off’) set(gcf, ’name’, ’Vector’) cla; set(gca, ’Position’, [.1, .1, .8, .8]); set(gca, ’xlim’, [0, 10]); set(gca, ’ylim’, [0, 10]); set(gca, ’xtick’, [0 : 10]); set(gca, ’ytick’, [0 : 10]); grid on; xlabel(’x’); ylabel(’y’); % Исходные данные A= [1, 2];B= [3, 5];C= [3, 2];D= [5, 5];O= [7, 9];M= [6, 6];N= [8, 6]; K= [4, 9]; L= [3, 6];P= [9, 2];R= [6, 2];U= [6, 3];V= [9, 3]; % Длины отрезков dAB=dlina(A,B) dCD=dlina(C,D) dON=dlina(O,N) dOM=dlina(O,M) dKL=dlina(K,L) dPR=dlina(P,R) dUV=dlina(U,V) % Построение вектора AB vector(A,B); A_=text(A(1)+0.3,A(2)-0.3, ’A’); set(A_, ’FontSize’, 20) B_=text(B(1)+0.3,B(2)-0.3, ’B’); set(B_, ’FontSize’, 20) % Построение вектора CD vector(C,D); C_=text(C(1)+0.3,C(2)-0.3, ’C’); set(C_, ’FontSize’, 20) D_=text(D(1)+0.3,D(2)-0.3, ’D’); set(D_, ’FontSize’, 20) % Построение вектора OM vector(O,M); O_=text(O(1)+0.3,O(2)-0.3, ’O’); set(O_, ’FontSize’, 20) M_=text(M(1)+0.3,M(2)-0.3, ’M’); set(M_, ’FontSize’, 20) % Построение вектора ON vector(O,N); O_=text(O(1)+0.3,O(2)-0.3, ’O’); set(O_, ’FontSize’, 20) N_=text(N(1)+0.3,N(2)-0.3, ’N’); set(N_, ’FontSize’, 20) % Построение вектора KL vector(K,L); K_=text(K(1)+0.3,K(2)-0.3, ’K’); set(K_, ’FontSize’, 20) L_=text(L(1)+0.3,L(2)-0.3, ’L’); set(L_, ’FontSize’, 20) % Построение вектора PR vector(P,R); P_=text(P(1)+0.3,P(2)-0.3, ’P’); set(P_, ’FontSize’, 20) R_=text(R(1)+0.3,R(2)-0.3, ’R’); set(R_, ’FontSize’, 20) % Построение вектора UV vector(U,V); U_=text(U(1)+0.3,U(2)-0.3, ’U’); set(U_, ’FontSize’, 20) V_=text(V(1)+0.3,V(2)-0.3, ’V’); set(V_, ’FontSize’, 20) % Решение примера 6.3 % Длины отрезков: AB = 3.6056 CD = 3.6056 ON = 3.1623 OM = 3.1623 KL = 3.1623 PR = 3 UV = 3Листинг 6.3. Сравнение векторов (пример 6.3).