ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 03.05.2019

Просмотров: 693

Скачиваний: 5

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

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 


background image

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) 

Параметры 

 


background image

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 
 


background image

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); 


background image

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