ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 03.05.2019
Просмотров: 693
Скачиваний: 5
11
integer mxIsNumeric
mwPointer mxGetM, mxGetN
C Pointers to input/output mxArrays:
mwPointer x_ptr, y_ptr
C Array information:
mwPointer mrows, ncols
mwSize size
C Arguments for computational routine:
real*8 x_input, y_output
x_ptr = mxGetPr(prhs(1))
C Get the size of the input array.
mrows = mxGetM(prhs(1))
ncols = mxGetN(prhs(1))
size = mrows*ncols
C Create Fortran array from the input argument.
call mxCopyPtrToReal8(x_ptr,x_input,size)
C Create matrix for the return argument.
plhs(1) = mxCreateDoubleMatrix(mrows,ncols,0)
y_ptr = mxGetPr(plhs(1))
C Call the computational subroutine.
call timestwo(y_output, x_input)
C Load the data into y_ptr,
C which is the output to MATLAB.
call mxCopyReal8ToPtr(y_output,y_ptr,size)
return
end
C---------------------------------------------------
C Computational routine
subroutine timestwo(y_output, x_input)
real*8 x_input, y_output
y_output = 2.0 * x_input
return
12
end
Подготовка МЕХ-файла
Проведение вычислений
=========================================================
Еще один пример
Вычисление определённого интеграла по квадратурной формуле
Гаycса
Для вычисления воспользуемся подпрограммой на Фортране QS12R.
Подпрограмма входит в Библиотеку численного анализа НИВЦ МГУ.
Ссылка на текст, приведенный ниже
http://num-anal.srcc.msu.ru/lib_na/cat/q/qs12r.htm
Подпрограмма: QS12R
Назначение
Вычисление определенного интеграла по квадратурной формуле
Гаусса.
Математическое описание
QS12R вычисляет интеграл с заданной абсолютной погрешностью на
отрезке интегрирования по формуле
( )
(
)
(
)
1
/ 2
2
2
B
N
i
i
i
A
B
A
y
A
B
f x dx
B
A
C
f
=
−
⋅
+
≈
−
⋅
⋅
+
∑
∫
,
где
i
y
и
i
C
соответственно узлы и веса Гаусса для отрезка [-1, 1].
Л.Г. Васильева. Набор стандартных программ численного интегрирования с
фиксированным распределением узлов. Сб. «Численный анализ на ФОРТ-
РАНе», вып. 8, Изд-во МГУ, 1974.
Использование
SUBROUTINE QS12R (RINT, A
, В, F, E, N, IERR)
Параметры
13
RINT –
вещественная переменная, содержащая вычисленное значение
интеграла;
A
, В – заданные нижний и верхний пределы интегрирования (тип: ве-
щественный);
F –
имя вещественной подпрограммы-функции, вычисляющей
подынтегральную функцию
( )
f x
;
E –
заданная абсолютная погрешность вычисления интеграла
(
тип: вещественный);
N –
целая переменная, задающая число узлов интегрирования;
IERR –
целая переменная, служащая для сообщения об ошибках, об-
наруженных в ходе работы подпрограммы; при этом:
IERR = 65 –
когда заданная точность не может быть достигнута
при максимально возможном числе узлов интегри-
рования; значение N полагается равным - 1;
IERR = 66 –
когда заданное число узлов интегрирования не
принадлежит списку возможных узлов.
Вызываемые подпрограммы
UTQS10 –
подпрограмма выдачи диагностических сообщений при ра-
боте подпрограммы QS12R.
Замечания по использованию
B процессе вычисления число узлов интегрирования N может принимать
только следующие значения:
(1) 2, 4, 6, 8, 10, 12, 16, 24, 32, 48, 64, 96.
Проводится несколько последовательных просчетов, причем для каж-
дого последующего просчета берется очередное число узлов из списка
(1).
Если абсолютная величина разности двух последовательных просчетов
интеграла не превосходит E, то счет заканчивается, и за значение инте-
грала принимается результат последнего просчета. Если список (1) ис-
черпан и заданная точность не достигнута, то N полагается равным - 1.
При E ≤ 0 происходит только один просчет с заданным N.
Пример использования
REAL FUNCTION F(X)
REAL X
F = 1./(X*SQRT(1. + ALOG(X)) )
RETURN
END
14
EXTERNAL F
INTEGER N
REAL RINT, A, B, F, E
A = 1.
B = EXP(3.)
E = 0.0000001
N = 2
CALL QS12R {RINT, A, B, F, E, N, IERR)
Результаты:
RINT = 1.9999999999
N = 32
Для дальнейшей работы нам надо разобраться с таким интересным
средством работы в Matlab как function_handle.
Массивы указателей на функции (function_handle arrays)
Одним из типов данных, заслуживающим внимания, является класс
function_handl
e. С термином handle (произносится – хэндл) многие програм-
мисты сталкивались при работе с файлами при создании подпрограмм обра-
ботки событий в различных визуальных средах. Термин handle пока не по-
лучил единообразной трактовки в отечественной литературе. Под этим тер-
мином скрывается системный способ идентификации некоторых программ-
ных компонентов. Так, например, при работе с файлами вместо их иденти-
фикаторов (имен дисковых файлов или их полных спецификаций) в опера-
торах обмена указывается тем или иным способом созданный handle. Им
может быть конкретное число, которое операционная система присваивает
открываемым файлам (int fl=open...), или указатель на блок управле-
ния файлом (см. в C++ описание типа FILE *fl;). Иногда этот термин
именуют дескриптором (т. е. описателем). Но, видимо, наиболее точно тер-
мину handle в русском языке соответствуют термины указатель или ссылка.
Указатель на функцию (function_handle) обеспечивает возмож-
ность доступа ко всей информации, необходимой для вычисления значения
этой функции. Создается такой указатель (а по терминологии MATLAB —
массив указателей) одним из двух следующим способов:
» f_h=@funl;
» f_h=str2func('funl')
В результате и той, и другой операции создается указатель f_h, кото-
рый «смотрит» на функцию с именем funl. Первый вариант очень напоми-
нает присвоение адреса переменной указателю соответствующего типа в
C++ (int x; int *px=&x;
). Указатель f_h может быть передан в каче-
стве аргумента другой функции:
» y = integral(a,b,f_h);
15
Для того чтобы функция integral могла воспользоваться значе-
нием функции funl (x), она использует системную процедуру feval:
» z = feval(f_h, x);
В фирменных руководствах утверждается, что использование указа-
телей несколько повышает производительность интерпретатора при много-
кратных обращениях к функции.
Дополнительную информацию об использовании этого типа данных
можно найти в справке Matlab, сделав поиск по ключевому слову func-
tion_handle.
Рассмотрим пример использования этого типа данных. Зададим
функцию, реализующую возведение числа в 5 степень
Теперь, чтобы получить пятую степень числа, например, 2, надо запи-
сать
Этот же результат можно получить, используя функцию Matlab fe-
val,
что мы и будем делать в дальнейшем
Теперь этот синтаксис используем для интегрирования нашей функ-
ции через процедуру, написанную на Фортране. Отметим следующую важ-
ную особенность. Основной тип данных Matlab – double, в Фортране это
соответствует типу Real*8. Так как в используемой нами процедуре на
Фортране используется тип Real, то и в Matlab надо использовать соответ-
ствующий тип данных – single.
Вызовем Matlab Editor и создадим файл Test.m