ИНТЕРНЕТ-МАТЛАБ iMATLAB

Первая версия языка для книг с исполняемыми алгоритмами, на ее основе возник java-matlab. Исполнительная среда кроссплатформенная, но плоттер построен на расширенных возможностях браузера Internet Explorer.

НОВЫЙ КУРС

МОДЕЛИРОВАНИЕ

НЕЛИНЕЙНЫЕ СИСТЕМЫ

ЛАБОРАТОРНЫЕ РАБОТЫ

ИНТЕРНЕТ ИССЛЕДОВАНИЯ

ДИСКРЕТНАЯ АЧХ СИСТЕМ

МАТРИЦЫ АДАМАРА

М-МАТРИЦЫ

ON LINE

СИНТАКСИС iMATLAB

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

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

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


A=[1 2; 3 4], B={A+A}, B=?

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

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

Для набора сетевых книг с iMATLAB приведены правила верстки, инструкции для вставки математических формул, матриц и иллюстраций.

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

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

Во-первых, ось времени t (наименование аргумента фиксировано). Она генерируется на n точек специальной функцией t=time(протяженность n), а не t=0:шаг:протяженность, по умолчанию n=100. Функции времени t вводятся предикатом fun


t=time(5), x=fun(sin(t)), y=fun(cos(2*t)), [x y]=??

Генератор с ":" ввиду ненужной сложности трансляции не употребляется. Соответственно, для выделения матричных блоков есть специализированные на этом векторная y=block(x 0 n) и матричная B=blocks(A 0 n 0 m) функции.

Во-вторых, для операций c матрицами вводятся фигурные скобки A={B+C}, это касается также приравниваний A={B}. Транспонирование, нормирование, вычисление диагонали вводятся унарными операторами tr(A), norms(A), diag(A). Сложные формулы A={{B'*C+D}} поддерживают операционное транспонирование, ограничивается лишь тип аргументов (число с десятичной точкой не компилируется).

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

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

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

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

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

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

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

Количество строк и столбцов матрицы возвращают функции 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).

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

Вывод информации A=?, в виде графика y=??, для матрицы вызывается матричный плоттер. Есть кнопка адаптации запятой для Exel, данные через клипбоард отправляется в ячейки с указанием пробела в качестве сепаратора. Вывод в форматax матриц: A=?M (MatLab), A=?m (iMatLab).

Вывод (небольших) матриц mesh(A), пример: A=rands(4), mesh(abs(A)).

Плоттер plot(t [x y]) и т.п. или g=[t x y], plot(g). Есть спаренный вывод переменных и функций для отладок: [a b]=?, [t y]=??.


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)

Масштаб осей фиксируется по axis(амплитуда) или axis(minX maxX minY maxY).

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


A=rands(4), D=eig(A), diags(D), plots(D)

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

BAR-плоттер удобен для снятия картинок в отчеты (оконный), вывод следующего графика в новое окно задается опцией :new.


t=time(2*PI), x=fun(sin(t)), y=fun(cos(t)), g=[x y], bar(g:2D)

Опционно строятся цветные профили матриц (C), графики (G, 2G, 2G2), фазовые портреты (@,2@,D,2D,2D2), поверхности и столбцовые диаграммы (M, B, 3D или 3T, если первый столбец задает время), линейчатые и круговые диаграммы (L, 2L, 2L2, DG, 2DG, 3DG), и т.д.

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

ПРИМЕР РЕШЕНИЯ СИСТЕМЫ УРАВНЕНИЙ

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


A=[-1 -2; 1 -2], b=[2 2], x={A\b}, x=?

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

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

Прямоугольная матрица (из 1) генерируется A=matrix(n m).

Вектор из единиц 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).

ВИЗУАЛИЗАЦИЯ ДИНАМИЧЕСКИХ МОДЕЛЕЙ

Классические в теории управления параметры числителя и знаменателя передаточной функции системы используются после указания закона управления u=one(t)) для моделирования (linear system simulation) реакции по lsim()


N=[1 0], D=[0.01 0.1 0], 
t=time(1), u=one(t), y=lsim(N D u(t)), [t y]=??

В системе сетевых книг общую папку рисунков моделей динамических объектов можно менять на частную папку рисунков книги по folder(.).

Рисунок open subject airplane выбирается из общей или частной папки объектов, далее, согласно расчету, указываются его координаты airplane moves at [x y], далее, если не возникнет смысловой путаницы, вместо наименования управляемого объекта разрешено употреблять обезличенное it.

Глагол движения it moves 10 right/left/up/down смещает рисунок, соответственно, вправо, влево, вверх, вниз. Предикатор at позволяет указать абсолютные координаты выводимого рисунка it moves at 100 horizontal или vertical (line). Под синтез изображения зарезервирована точка в конце предложения, так сделано, например, в Visual MatLab. Чтобы не перегружать анализатор текста, пока употребляется глагол show.


% TRANSFER FUNCTION,
N=[1 7], D=[0.5 4 7], 

% SIMULATION,
t=time(3), u=one(t), y=lsim(N D u(t)), 

% VISUALISATION,
open subject airplane, 
for i=0:size(t), 
  it moves at [10+2*i 150-100*y[i]], 
  show,
end,

Как видно, правила совсем простые. Мультипликация изображения, также, как и вывод графиков происходят по завершении всех расчетов. Шаг таймера вывода картинок задан в десять миллисекунд, его можно настраивать timer(шаг). Альтернативой этому подходу служат более гибкие циклические сценарии, исполняемые в ходе (а не по завершении) расчета (см. далее).

Пусть модель пространства состояний линейной динамической системы 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].

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


A=[-1 -3; 3 -2], b=[1 1], c=[1 3], S=ss(A b c), 
t=time(5), u=one(t), y=lsim(S u(t)), plot(t [u y]), %график,

ТУЛБОКС CONTROL

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


%toolbox control, 

N=[1 7], D=[0.5 1 5], t=time(5), 
u=one(t), y=lsim(N D u(t)), plot(t [u y])

Числитель N и знаменатель D можно заменить обозначением системы S=tf(N D).

Если заданы начальные состояния цепи интеграторов x=[y y' y''..] с обратными связями, то их учет выполняется перечислением аргументов в несколько иной функции


%toolbox control, 

N=[1 7], D=[0.5 1 5], t=time(5), 
x=[0.5 0], u=one(t), y=lsims(N D x u t), plot(t [u y])

Импульсная весовая реакция рассчитывается у этой системы при D={D/D[0]} как y=impulse(N D t).

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

Решение системы уравнений 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=[1 2; 5 6], c=[3 7], A={[A c]}, mesh(A), A=?

Запись 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), в двух колонках итога хранятся действительные и мнимые части собственных значений.

СОБСТВЕННЫЕ ЗНАЧЕНИЯ И СОБСТВЕННЫЕ ВЕКТОРЫ МАТРИЦ

D=eig(A) возвращает диагональную матрицу собственных значений матрицы A=VD/V. В случае комплексном пара собственных чисел a+jb, a-jb представлена блоком [a b;-b a] на диагонали. Это квазидиагональное представление называют вещественнозначной жордановой матрицей. V=eigv(A) или [V D]=eig(A) возвращают также матрицу V, вектор-столбцами которой будут собственные векторы A. В комплесном случае V содержит вещественную и мнимую компоненты комплексного собственного вектора в двух соответствующих столбцах. С проблемой собственных значений связаны также две резольвенты: R=res(A-d*I), где d - число, Q=res(A+b*c), где b и c - это вектор и строка для согласования размерности их произведения.

Вывод собственных значений на комплексную плоскость:


A=rands(5), D=eig(A), mesh(D), diags(D), plots(D)

РЕШЕНИЕ СИСТЕМЫ ЛИНЕЙНЫХ УРАВНЕНИЙ

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


A=[1 2; 3 4], b=[1 1], x={A\b}, x=?

ИНВЕРСИЯ И ПСЕВДОИНВЕРСИЯ МАТРИЦ

Для инверсии и псевдоинверсии матрицы употребляется I=inv(A), вычисления ранга r=rank(A), произведения на вектор b={A*x}, вычисления синусов углов раствора колоночных векторов по отношению к линейным оболочкам, построенным на них: S=conds(A), число обусловленности в виде произведения condS=mul(S) дает 1, если столбцы ортогональны и 0, если есть линейно зависимые столбцы.

Псевдоинверсия A=inv(B) совпадает с обратной матрицей в невырожденном случае, в прочих случаях ||AB-I||->min, ||A||->min. Порог tolerance вычисления ранга можно переназначать, по умолчанию tolerance=0.0000001.

ШКОЛЬНЫЕ ФОРМУЛЫ

Определитель матрицы, в общем, ищется через произведение ее собственных значений, но для матриц не выше четвертого порядка есть функция, вычисляющая определитель по известным в матричной алгебре формулам: if size(A)<4, d=det(A), end.

ТРИАНГУЛЯЦИИ МАТРИЦ

Разложение Холецкого для симметричной положительно определенной матрицы на треугольные сомножители A=L*L' имеет вид L=chol(A).

Компоненты A=QR разложения на ортогональный и правый верхний треугольный сомножители находятся функциями: Q=Qr(A), R=qR(A), R=qr(A), [Q R]=qr(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, [x y]=??

Pеверс (шаг только -1):


S=0, for i=5:-1:1, S=S+1, end, S=?

Цикл по условию:


S=0, while S<10, S=S+1, end, S=?

ПОДПРОГРАММЫ (ФУНКЦИИ ПОЛЬЗОВАТЕЛЯ)

Подпрограммы вводятся предикатором function: SET(), A=2, end. Разрешено вводит локальные переменные var a b c (как определение их и кратко в цикле, после оператора цикла for var i=0:size(x), ... , end) и аргументы - отделяемые пробелами, значение функции указывает return.


function: SUM(X Y), S=X+Y, return S, end, вызов S=SUM(1 2)

Механизм функций заимствован у javascript: переменные передаются как указатели (адресами). Поэтому их можно считать вход-выходными параметрами (т.е. нужно быть осторожнее), но матричное переназначение их обрывает связь (буферизирует). По return можно возвращать составные аргументы S=[A B C], return S. Здесь S[0] есть А.

Ограничения. Идут от простоты транслятора - имя функции пользователя не должно заканчиваться именем встроенных в транслятор функций. Трансляцию можно ускорить акцентирующим внимание вызовом call S=SUM(1 2). Этот анахронизм становится обязателен, если в качестве имени функции употребляется имя собственное без аргументов call Lorenz.

ТУЛБОКСЫ, СИНГУЛЯРНОЕ РАЗЛОЖЕНИЕ МАТРИЦЫ

Пользователь может писать свои библиотеки (тулбоксы). Приведем пример тулбокса, посвященного двум процедурам сингулярного разложения матрицы A=USV'.


A=[4 0; 0 2], S=SVD(A), S[0]=?, mesh(S[1]),

% ВЫЧИСЛЕНИЕ СИНГУЛЯРНЫХ ЗНАЧЕНИЙ,
function: SVD(A), 
var U V A S, S={A'*A}, [V S]=eig(S), S={abs(S)}, S={&#8730;(S)}, 
U={A*V}, U={U/S}, norms(U), norms(V), diag(S), 
S=[S U V],
return S, 
end,
% ВЫЧИСЛЕНИЕ СИНГУЛЯРНЫХ ЗНАЧЕНИЙ,
function: SVD2(A),
var A S, for var i=1:20, S=qr(A), tr(S), end, 
diag(S), S={abs(S)}, 
return S, 
end 

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

Введены числа PI, E, корень из двойки SQRT2, логарифмы: LN2=ln(2), LN10=ln(10).

ЧАСЫ

Функция clock(a) возвращает: 1 - час, 2 - минута, 3 - секунда, 4 - миллисекунда, 5 - год, 6 - месяц, 7 - день.



Rambler's Top100