Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Scilab / SciLab

.pdf
Скачиваний:
110
Добавлен:
31.12.2018
Размер:
4.38 Mб
Скачать

2) Способ 2.

Построение программы интерфейса. Они могут быть написаны пользователем на основе примеров данных в каталогах scilab/routines/examples/interface-tutorial и scilab/routines/examples/interfacetour. Примеры для Matlab-подобного интерфейса

даны в каталоге scilab/routines/examples/mexfiles.

3) Способ 3.

Программа интерфейса может быть создана с помощью команды intersci. Она использует файл .desc, который описывает и C (или Fortran) программу(ы), и имя и параметры соответствующей в Scilab функции(ий).

4) Способ 4.

Можно добавить постоянную новую команду в Scilab, составив программу интерфейса, как было сказано выше, и затем создав новый исполняемый код для Scilab. Новая команда должна быть добавлена в файл scilab/routines/default/fundef. В этом случае программе интерфейса будет дано специальное название (например, по умолчанию matus2) и номер. Файл /default/fundef должен быть обновлен. Новый выполняемый код будет создан после выполнения "make all" в главном каталоге Scilab.

Динамическое линкование

Пусть мы хотим в пакете Scilab воспользоваться функцией, написанной на языке C. В качестве примера воспользуемся текстом функции ext1c.c из каталога /scilab/examples/link-examples. Это подпрограмма выполняет сложение двух матриц. Замечание: В каталоге /scilab/examples/link-examples представлены и другие простые и полезные примеры.

Последовательность действий для осуществления динамического линкования:

Шаг 1.

Набрать в любом текстовом редакторе подпрограмму для вычисления функции на языке C или Fortan. Сохранить ее с расширением .c для языка C (соответственно .f для языка

Fortan).

Содержание файла ext1c.c:

int ext1c(n, a, b, c) int *n;

double *a, *b, *c;

{

int k;

for (k = 0; k < *n; ++k)

{

c[k] = a[k] + b[k];

}

return(0);

}

2

Шаг 2.

Скомпилировать ext1c.c в объектный файл.

Для этого на компьютере должен находится компилятор языка С (Fortran). Компиляторы не являются частью пакета Scilab и не содержатся в нем. Если Вы работает в операционной системе Windows, то следует пользоваться компиляторами из пакета cygwin.

gcc -c ext1c.c

В результате будет создан файл ext1c.o

Шаг 3. Запустить пакет Scilab и в нем выполнить:

link("ext1c.o","ext1c","C")

Замечание: В данном случае имя подпрограммы совпадает с именем объектного файла. В общем случае в одном объектном файле подпрограмм может быть несколько. Подробно смотрите help link.

Для проверки, правильно ли слинкован файл, служит команда c_link. Если все корректно, то команда возвращает значение T (TRUE).

Шаг 4.

Теперь мы можем использовать ext1c в качестве имени функции внутри пакета Scilab. Вызов этой функции может осуществляться с помощью команд call или fort. x_a=[1,2,3];x_b=[4,5,6];x_n=3; // Задание начальных условий c=call('ext1c',x_n,1,'i',x_a,2,'d',x_b,3,'d','out',[1,3],4,'d')

В результате получим суммарную матрицу c=[5,7,9]

В качестве параметров команды call выступают имя вызываемой подпрограммы (в данном случае 'ext1c') и ее аргументы. В примере приведена длинная форма синтаксиса: после значения каждого аргумента указан номер его порядковый номер в вызываемой процедуре и его тип в кавычках. Например, конструкция ...,x_a, 2,'d',... в качестве параметров команды call означает , что x_a является значением второго аргумента для подпрограммы

ext1c типа double.

Возможно применение и короткой формы синтаксиса команды вызова call, которая дает более быстрый код и простой синтаксис. Смотри help call. Однако это потребовало бы написания дополнительного небольшого (C или Fortan) интерфейса.

Замечания:

1)Для прекращения линкования служит команда ulink. Для простоты лучше использовать для линкования форму q=link("ext1c.o","ext1c","C"). Тогда команда прекращения линкования будет выглядеть как ulink(q). В противном случае вместо q следует поставить целое число, отвечающее за соответствующий процесс.

2)Для получения информации о линкованных на данный момент библиотеках и функциях служит команда link("show")

3

Пример для языка Fortran.

Шаг 1.

Содержание файла ext1f.f:

subroutine summa(n,a,b,c) double precision a(*),b(*),c(*) do 1 k=1,n

c(k)=a(k)+b(k)

1continue return end

Запишите его в файл ext1f.f.

Шаг 2.

g77 -c ext1f.f

Шаг 3.

Перейдите в среду Scilab и выполните: link("ext1f.o","summa","F")

Замечание: Для языка fortran флаг "F" можно опустить: link("ext1f.o","summa")

Шаг 4.

Теперь можете использовать подпрограммы из слинкованного файла ext1f.o. a=[1,2,3];b=[4,5,6];n=3; call('summa',n,1,'i',a,2,'d',b,3,'d','out',[1,3],4,'d')

Результат: ans =

! 5. 7. 9.!

Особенности интерфейса между C, Fortan и Scilab в операционной системе Windows

Для работы в операционной системе Windows необходимо дополнительно инсталлировать один из двух свободно распространяемых пакетов:

Сygwin

MinGW("Minimalistic GNU for Windows").

Смотрите текст в файлах \scilab\Win85-util\DllDemo\how-to-build-dlls.txt и \scilab\Win85-util\DllDemo\Readme.txt.

4

Об операционной среде Cygwin

Cygwin является операционной UNIX-средой, расширенная Red Hat, для Windows. Она состоит из двух частей:

1)DLL (cygwin1.dll), которая работает как UNIX эмуляция

2)Из коллекции инструментов, перенесенных из UNIX, позволяющих имитировать присутствие в UNIX/LINUX.

Полезные ссылки о cygwin:

http://sources.redhat.com/cygwin/

http://cygwin.com/

http://sources.redhat.com/cygwin/download.html

Cygwin Package List http://sources.redhat.com/cygwin/packages

Cygwin User's Guide http://cygwin.com/cygwin-ug-net/cygwin-ug-net.html

http://cygwin.com/xfree

Если Вы хотите пользоваться удаленной машиной с установленным Linux и Scilab, а на Вашем терминале установлена только операционная система Windows, то для полноценного доступа к пакету на удаленной машине Вам будет необходим cygwin с приложением эмуляции терминала xfree86.

Xfree86 - это свободно распространяемая система XWindow System, которая работает как под Unix-образными системами, включая Linux, Sun Solaris x86, так и под платформами OS/2 и Cygwin.

Замечание: Установка Cygwin дело само по себе хлопотное и стоит подумать, не установить ли вместо этого Linux на локальной машине (да и Scilab под Linux тоже). Здесь можно найти информацию о различных перекомпилированных версиях Scilab.

5

SCILAB: Библиотеки

Введение

Библиотеки являются коллекциями функций, которые могут автоматически загружаются в окружение пакета Scilab при вызове Scilab, либо загружаются по желанию пользователя. Библиотеки создаются с помощью команды lib.

Примеры библиотек Вы можете посмотреть в каталоге SCIDIR/macros. В каждом из подкаталогов библиотек содержится ASCIIфайл names, в котором перечислены имена всех функций библиотек, файлы с расширением sci содержат открытый код - текст функции на языке пакета Scilab и соотвествующие им скомпилированные файлы с расширением bin. Соответствующий Makefile вызывает компиляцию функций и генерацию bin файлов. Скомпилированные функции библиотеки автоматически загружаются в среду Scilab при первом вызове.

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

Вы можете с ними ознакомится, заглянув в подкаталог /macros/ пакета Scilab и далее в подкаталог избранной Вами библиотеки. Это файлы с расширением sci. Наличие открытого текста функций в файлах sci часто полезно, если Вам непонятно, какие действия выполняет функция или Вы заподозрили какие-то ошибки в работе этой функции. Так же это дает возможности коррекции функции. Но не следует этим увлекаться, а лучше сообщить о найденной ошибке производителю программного продукта Inria.

Для построения своей библиотеки может быть использована команда genlib. Кроме того, для каждой библиотечной функции есть соответствующий help-файл в каталоге

SCIDIR/man/eng/.

1

Структура библиотек

Деление на отдельные библиотеки в пакете Scilab можно узнать, выполнив команду help без параметров. В результате мы увидим следующий список в окне help с надписью "Index" в титуле верхнего окна:

Этот список соответствует подкаталогам каталога SCIDIR/macros.

2

Допустим, мы хотим узнать, какие функции содержаться в библиотеке под названием "Linear Algebra". Нажмем мышью на эту надпись в окне help и получим следующее окно:

Заметим, что в окно не поместились все функции библиотеки, следует еще использовать прокрутку. Если Вы сравните команды из этого списка с названиями файлов из каталога SCIDIR/macros/algebre/, то Вы увидите, что они практически совпадают. Однако, некоторым командам, например, balanc и bdiag нет соответствующих sci и bin файлов. Это вызвано тем, что часть простых функций была в свое время сделана встроенными в пакет и в этом смысле их "библиотечность" условна. Файлы справок присутствуют и для этих функций.

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

3

SCILAB: Библиотеки

Глава 1. Библиотека линейной алгебры

Содержание главы:

Введение

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

Как найти обратную матрицу?

Как найти псевдообратную матрицу?

Как найти сингулярное разложение матрицы?

Как найти собственные значения матрицы?

Как определить норму матрицы?

Как определить модуль матрицы?

Как определить детерминант (определитель) матрицы?

Как извлечь из матрицы диагональные элементы?

Как определить ранг матрицы?

Как найти ядро (нуль-пространство) матрицы?

Солвер для решения линейных уравнений

Введение

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

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

1

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

Вырожденность

singularity

Детерминант (определитель)

determinant

Единичная матрица

identity matrix

Модуль матрицы

absolute value, magnitude

Норма матрицы

matrix norm

Обратная матрица

inverse of matrix

Псевдообратный

pseudoinverse

Пучок матриц

pensil matrix

Размерность

dimension

Ранг матрицы

rank of a matrix

Разреженная матрица

sparse matrix

Собственные значения матрицы

eigenvalues of matrices

Сингулярное разложение

singular value decomposition (SVD)

Ядро (нуль-пространство) матрицы kernel, nullspace

Как найти обратную матрицу(inverse of matrix)?

Способ 1.

С помощью команды inv. Синтаксис

inv(X)

Параметры

X : действительная или комплексная квадратная матрица, полиномиальная матрица или рациональная матрица.

Для полиномиальной матрицы команда даст тот же результат, что и invr.

В результате преобразования inv(X)*X, будет иметь вид единичной матрицы (то есть диагональные элементы =1, а остальные элементы =0). Обратная матрица находится методом LU-факторизации, используя библиотеку LAPACK.

Пример 1.

a=[1 2 3;2 2 3; 5 -1 2] b=inv(a)

Результат:

b =

1.

-8.327E-17

!

! - 1.

! - 1.5714286

1.8571429

- .4285714

!

! 1.7142857

- 1.5714286

.2857143

!

c=a*b

2

Результат: c =

!

1.

0.

1.110E-16 !

! - 8.882E-16

1.

0.

!

!

4.441E-16

- 8.882E-16

1.

!

То есть практически получили единичную матрицу.

Пример 2.

Получение обратной матрицы для матрицы, заданной в алгебраической (символьной форме).

r=[poly([1 2 3],"x","c"),1;poly([1 -2],"x","c"),2]

Результат : r =

! 1 + 2x + 3x2

1 !

 

!

 

!

 

! 1 - 2x

2 !

 

inv(r)

 

 

 

Результат:

 

 

ans =

2

- 1

!

!

! ------------

--------------- !

! 1 + 6x + 6x2

1 + 6x + 6x2

!

!

 

1 + 2x + 3x2

!

! - 1 + 2x

!

! ------------

--------------- !

! 1 + 6x + 6x2

1 + 6x + 6x2

!

Замечание: Если обращаемая матрица вырожденна (singular) или почти вырожденна (определитель матрицы равен или близок к нулю) (например, a=[1 2 3;11 22 33; 110 220 330]), то в результате выполнения команды b=inv(a) получим сообщение:

!--error 19 singular matrix

Способ 2.

Для обращения матриц в алгебраических виде существует специальная команда invr. Синтаксис

F = invr(H)

Параметры

H : полиномиальная или рациональная матрица

F : полиномиальная или рациональная матрица

В результате работы команды вычисляется F=H-1 с помощью алгоритма Леверье

(Leverrier).

Способ 3.

Для полиномиальных матриц с помощью команды coffg. Параметры

Fs : квадратная полиномиальная матрица.

Команда coffg вычисляет Fs-1 методом ко-факторов (co-factors method). В результате выполнения команды будут получены два числа, полностью характеризующие обратную матрицу:

Ns = числитель (является полиномиальной матрицей) и d = общий знаменатель.

Матрица, обратная данной матрице Fs, будет вычисляться по формуле Ns/d.

3

Соседние файлы в папке Scilab
  • #
    31.12.20183.02 Кб366 tema.sce
  • #
    31.12.20181.07 Кб35ChemDifur6II.sce
  • #
    31.12.20181.43 Mб58introscilab-v1.3-ru.pdf
  • #
    31.12.2018753 б40Neyavnayashema.sci
  • #
    31.12.20181.94 Кб38Partialderivative.sci
  • #
    31.12.20184.38 Mб110SciLab.pdf
  • #
    31.12.2018709 б38syst333.sci
  • #
    31.12.2018266 б35tema2.sce
  • #
    31.12.2018361 б36tema5.sci