ИСПОЛНЯЕМЫЕ АЛГОРИТМЫ

В Internet Matlab (iMatLab) за основу принята стилизованная версия языка Matlab, изложенная в фундаментальной работе Дж. Голуба и Ч. Ван Лоуна "Матричные вычисления". При этом были учтены некоторые особенности интернет языков программирования. Нумерация компонент переменных начинается не с единицы, а с нуля. Бинарные матричные выражения, чтобы отличить их от скалярных, берутся в фигурные скобки A={B*C}, это заметно упрощает сетевой транслятор и акцентирует внимание на типе аргументов. Для более сложных выражений в экспериментальном режиме введен претранслятор с двойными скобками A={{B*C+D}}. В on line книгах алгоритмы помещаются между []-тэгами math.


Тэги [math] ... [/math] окаймляют исполняемый код (неисполняемый пример-образец кодов вводится тэгом s). В редакторе страница делится на части, с каждой из них может быть связан свой алгоритм или иллюстрация, синтезированная на его основе: график, мультфильм.

Предикатором комментария начинается %опция, помечающая специфику алгоритмов math, окон iframe, аваторов talk, серверных языков code, примеров кода samp, отключенных кодов hide (опция дебаггера).

ОСНОВНЫЕ ОТЛИЧИЯ INTERNET MATLAB

Перечислим сначала основные отличия от, собственно, базового MatLab. Их три.

Во-первых, ось времени t (наименование аргумента фиксировано). Она генерируется специальной функцией t=time(протяженность), а не t=0:шаг:протяженность. Прочие функции времени t вводятся предикатом fun: x=fun(sin(t)), y=fun(cos(2*t)), [x y]=??, и т.д.

Во-вторых, для операций c матрицами вводятся фигурные скобки A={B+C}, это касается также приравниваний A={B}.

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

Предложения или операции (команды) отделены запятыми. Роль запятых в пределах предложения играет пробел. Поэтому в подпрограммах аргументы отделяются пробелом. Запись A = {B+C} ошибочна (пробелы).

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

% это значок комментария, обязательно завершаемый запятой.

ПРАВИЛА-ИСКЛЮЧЕНИЯ

Менее существенно (но все же важно) то, что Internet MatLab наследует свойства Internet языков, в частности, javascript. Здесь нет понятия обычного и транспонированного векторов. Эти векторы неразличимы. Адресация компонентов вектора начинается с нуля: x[0] - это первый элемент. Чтобы не было проблем с обустройством циклов перебора элементов size(x) возвращает номер последнего элемента вектора, меньший на единицу количества элементов. На первом месте при обращении к элементам матрицы A[j][i] стоит индекс j СТОЛБЦА.

РАЗМЕРНОСТИ ВЕКТОРОВ и МАТРИЦ, ВЫБОР КОЛОНОК

Количество строк и столбцов матрицы возвращают функции rows(A) и cols(A). Для циклов перебор элементов с нуля требует на единицу меньших значений максимальных индексов rowm(A) и colm(A).

Массив в интернет программировании давно уже не только матрица. Поэтому максимальное значение первого индекса возвращает универсальная функция size(A), которая особенно удобна для векторов.

Индекс элемента заключается в квадратные скобки X[i], причем у матриц выбор А[0] дает начальный столбец, A[1] - второй столбец, и т.д., т.е. изначально указывается номер столбца. Номер строки идет вторым символом: A[0][1] - это элемент A(1,0) матрицы A. Часть j колонки возвращает block(A[j] i1 i2). Фрагмент матрицы возвращает blocks(A i1 i2 j1 j2).

НЕКОТОРЫЕ ПРИМЕРЫ

Строки матрицы отделяются точкой с запятой А=[ 1 2 ; 3 4 ], типичные матричные присвоения и решение системы линейных алгебраических уравнений выглядят также, как и в MatLab.


МОДЕЛИРОВАНИЕ ДИНАМИЧЕСКИХ СИСТЕМ

Пусть модель пространства состояний линейной динамической системы dx/dt=Ax+bu, y=сx задана матрицей S=[A b; c 0], вычисляемой как S=ss(A b c). В последнем случае возможен реверс: A=S[0], b=S[1], c=S[2].

Тогда реакция такой системы на управляющее воздействие рассчитывается при помощи функции lsim (linear system simulation): y=lsim(S u(t)).


Можно указать параметры числителя и знаменателя передаточной функции системы: N=[1 0], D=[0.01 0.1 0], t=time(1), u=one(t), y=lsim(N D u(t)), [t y]=??.

ТУЛБОКС CONTROL

Комментарием вида %toolbox control подключаются библиотеки, где рассчитываются переходная функция y=step(N D t), импульсная весовая функция y=impulse(N D t), матрица системы S=tf(N D), матрица Фробениуса F=compan(N), ось значений частот f=frequence(W), диаграмма Боде a=bode(N D f) и др.

Если заданы состояния цепи интеграторов x=[y y' y''..], то учет начальных условий выполняется по y=lsims(N D x u t). Пусть управление отсутствует, тогда для систем первого порядка D={D/D[0]}, y=impulse(x D t).


ВЫВОД ДАННЫХ, ГРАФИКИ, СОБСТВЕННЫЕ ЗНАЧЕНИЯ МАТРИЦ

Вывод информации A=?, в виде графика y=?? (для матрицы вызывается матричный плоттер). Плоттер plot(x y), возможно y=[y1 y2 и т.п.] или g=[x y1 y2 и т.п.], plot(g).

Например: t=time(1), y=fun(sin(t)+3), [t y]=??, или t=time(2*PI), x=fun(sin(t)), y=fun(cos(2*t)), plot(x y). Вывод (небольших) матриц mesh(A), пример: A=rands(4), mesh(abs(A)).

Вывод собственных значений на комплексную плоскость plots(D), пример: D=eig(A), diags(D), plots(D).

ВСПЛЫВАЮЩЕЕ ОКНО (POP UP ПЛОТТЕР)

BAR-плоттер (оконный): bar(y). Пара соседних графиков отделяется опцией вывода в новое окно :new. Опционно строятся фазовые диаграммы (2D или @), поверхности и столбцовые диаграммы (M,B,2G,3D или 3T, если первый столбец задает время), цветные профили матриц (C) и т.д. Параметры в построитель передаются на лету, при большом количестве графиков процессов временную ось следует лимитировать. Плоттер удобен для снятия картинок в отчеты.

Разновидность этой команды ориентирована на чтение XML файлов с сервера (эти файлы могут быть более объемны, чем передаваемые 'на лету' матрицы): bar('A':M), receivebar('A') и т.п.

ГЕНЕРАТОРЫ ВЕКТОРОВ И МАТРИЦ

Ось времени и целые числа генерируются функциями t=time(T n), где n задает количество точек отрезка времени T, и x=line(n), соответственно. Пример: x=line(3) генерирует вектор из трех компонент x=[0 1 2].

Вектор из единиц x=one(n), нулевой вектор x=zero(n), вектор случайных чисел x=rand(n) с амплитудой не более, чем единица. Квадратные матрицы генерируются сходными функциями A=ones(n), B=zeros(n), R=rands(n). Помимо того для единичной и гилбертовой матриц есть функции I=eye(n), H=hilb(n).

Если надо сгенерировать вектор или матрицу того же размера, что и у образца, образец задается в качестве аргумента, например: I=eye(A).

МАТРИЧНЫЕ ВЫЧИСЛЕНИЯ

Решение системы уравнений Ax=b имеет вид: A=[1 2; 3 4], b=[1 1], x={A\b}, x=?. Левая и правая операции деления {A\B} и {A/B} отличаются тем, что в первом случае инвертируется матрица A, а во втором инвертируется уже B.

Для транспонирования матрицы и выборки элементов ее диагонали введены унарные функции tr(A) и diag(A), результат хранится в той же переменной A. Этим свойством отличется нормирование столбцов матрицы norms(A). Сходно выделяются собственные значения diags(A), в двух колонках итога хранятся действительные и мнимые части собственных значений.

Матричные вычисления водятся фигурными скобками. Это правило распространяется приравнивание значений матрицы A={B}. Для рекурсивного накапливания колонок матрицы служит запись A={[A c]}, объединение двух колонок: A=join(B C).


Запись A=B означает отождествление двух имен для одной и той же матрицы. Это касается также конструкции с векторами вида A=[B C], в которой B и С становятся синонимами соответствующих колонок.

Для инверсии матрицы введена функция B=inv(A). Умножать и делить матрицы можно поэлементно (поточечно), если указать точку {A.*B} и {A./B}. Можно оперировать со скаляром: {2*A}, {A/2}, {2+A}.

Скалярное произведение векторов выглядит как обычно: s={x'*y}. Можно умножать на транспонированную матрицу S={A'*B}. Транспонирование приводит к унарной tr(A) или к поли-операции S={{A+B'}}. Статус векторов недопределен, S={x*y} задает произведение вектора на строку. Гипербола вычисляется как y={1/x}. С проблемой собственных значений и методом наименьших квадратов связаны две характерные резольвенты: R=res(A-d*I), где d - число, Q=res(A+b*c), где b и c - это вектор и строка.

Унарные операции (без знака равенства): транспонирование tr(A), выделение диагонали diag(A), нижнего и верхнего углов tril(A) и triu(A), нормирование столбцов norms(A). Результат сохраняется в A. Сходно выделяются собственные значения из трехдиагональной матрицы diags(A), в двух колонках итога хранятся действительные и мнимые части собственных значений.

СКАЛЯРНЫЕ ФУНКЦИИ

Функции скалярного аргумента не требуют предикаторов: y=exp(x), y=log(x), y=sin(x), y=cos(x), y=tan(x), y=asin(x), y=acos(x), y=atan(x), y=sh(x), y=ch(x), y=floor(x), y=round(x), y=sign(x). Sqrt требует положительности аргумента.

СКАЛЯРНЫЕ ОПЕРАЦИИ С ЭЛЕМЕНТАМИ МАТРИЦ

Возможно коллективное выполнение скалярных операций над элементами матричного аргумента: f={floor(A)}, a={abs(A)} и т.д. При этом для тригонометрических функций разрешено использовать смену знака и скалярные множители: T=times(10) задает двумерный массив, Y={sin(T)}, Y={exp(-T)}, Y={exp(2*T)}.

ФУНКЦИИ ВЕКТОРНОГО и МАТРИЧНОГО АРГУМЕНТОВ

Функции времени t вводятся предикатором fun: y=fun(sin(t)+2*cos(t)). Опцией можно указать количество временных отсчетов в t=time(T 200), по умолчанию принято генерировать сто точек, начиная с нуля.

Для векторов есть суммирование и произведение элементов s=sum(x), p=mul(y).

Для векторов и матриц предусмотрены не требующие предикаторов функции поиска минимума и максимума элементов m=min(A), M=max(A), для абсолютных значений m=min(abs(A)), M=max(abs(A)), соответствующие индексы поиска хранят глобальные переменные: строчный indexrow и колоночный indexcol.

Введены вычисление насыщения y=sat(A M), где M задает максимально возможное абсолютное значение, и нахождение фробениусовой нормы n=norm(A). Реверс(флип) y=flip(X) инвертирует одномерный или многомерный массив по первому аргументу.

Для анализа полиномов: значение полинома v=polyv(N p) в точке p=[re im], результат - тоже комплексное число c амплитудой a=norm(v)).

ЛОГИКА (IF и SWITCH)

if A>B, A=?, else, B=?, end. Логическое "и" вводится привычным символом A>B&A>C, логическое "или" аналогично: A>B|A>C (чтобы не перегружать транслятор лишней работой проверку равенства элементов при этом следует писать строго придерживаясь интернет традиции как ==, т.е. A==B&A==C или A==B|A==C).

switch A case 1, операторы, case 2, операторы, otherwise, операторы, end.

ЦИКЛЫ

Перед циклами, задающими значения элементов массивов, используются генераторы: x=time(1), y=zero(x), for i=0:size(x), y[i]=sin(x[i]+3), end.

Пример цикла: S=0, for i=0:100, S=S+1, end, S=?. Pеверс (шаг только -1): S=0, for i=5:-1:1, S=S+1, end, S=?. Цикл по размерности вектора: S=0, for i=0:size(X), S=S+X[i], end, S=?.

Цикл по условию: S=0, while S<10, S=S+1, end, S=?.

НЕКОТОРЫЕ КОНСТАНТЫ

Введены числа PI, E, также корень из двойки SQRT2, логарифмы: LN2=ln2, LN10=ln10.


© artspb.com