Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Matlab_лек.8_Символьные вычисл_Текст.docx
Скачиваний:
5
Добавлен:
01.03.2025
Размер:
183 Кб
Скачать
☆

2.9.6.1. Численное вычисление интегралов в Matlab.

(ПРИМЕЧАНИЕ для расчетно-графической работы)

При выполнении некоторых вариантов РГР в MATLAB может потребоваться численное вычисление интегралов. Для этого могут быть использованы следующие функции [3, глава 2]:

trapz (x,y)- вычисление интеграла методом трапеций. В этом случае используется линейная аппроксимация, т. е. график функции y = f(x) представляется в виде ломаной, соединяющей точки yi. Формула трапеций при постоянном шаге , где n – число участков, имеет вид ;

quad - расчет интеграла методом Симпсона. Подынтегральная функция может задаваться с помощью дескриптора @ (тогда она должна программироваться в файле – функции) или - с помощью апострофов (тогда она записывается в самой программе quad). Особенности записи см. в Help или в приведенном ниже примере.

Пример. Вычислить и вывести на печать по методам трапеций и Симпсона значения интеграла

Возможные записи при вычислении методом трапеций могут иметь следующий вид:

>> x = 0 : 0.0001 : 1.0 ;

>> y = 1./ (1+x.^2) ;

>> z = trapz(x, y)

z =

0.7854

Вычисление методом Симпсона:

>> quad ( (1./(1+x.^2)) , 0, 1)

ans =

0.7854

В функции quad подынтегральное выражение является текстовым аргументом, а цифры 0 и 1 равны пределам интегрирования.

2.9.7.Решение уравнений и систем в символьном виде.

Алгебраические уравнения до четвертого порядка включительно решаются точно; функция solve выводит ответ в степенях рациональных чисел. Результат решения уравнения третьего порядка, к примеру, отображается в командном окне с использованием подстановок [1, с. 771].

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

Решение системы нелинейных уравнений также находится при помощи solve. Входными аргументами solve являются в данном случае левые части уравнений и переменные, по которым требуется разрешить систему. Например, для системы из двух уравнений определенных символьными функциями fl и f2 и зависящих от xl и х2, вызов функции solve выглядит так: s = solve (fl, f2, xl, x2). Результатом является структура s с полями x1 и х2, каждое из которых содержит символьное представление решения[1, с. 776].

Решение дифференциальных уравнений см. [1, с. 778].

2.10. Интерактивное взаимодействие м-функиий с пользователем [2, с. 185].

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

Очень часто бывает полезно контролировать ход выполнения М-функций. Для интерактивного взаимодействия с пользователем в М-языке предусмотрен ряд специальных функций. В частности, функция disp применяется для вывода промежуточных результатов в командное окно системы MATLAB. На основе анализа пользователем качества промежуточных результатов может приниматься решение о продолжении вычислений или об их прекращении.

Функция disp вызывается с единственным аргументом, который может быть числовым или символьным массивом (вектор, матрица). Пример использования функции disp при вычислении повторяющихся отрезков расходящегося гармонического ряда со все большим числом входящих в отрезки слагаемых:

S = 0; i = 1;

while 1

S = S + 1 / i;

str = sprintf ('i=%d S=%f ', i, S ); % запись в строку форматированных данных

% формат %d задает десятичное целое число со знаком, а %f –с плавающей точкой

disp( str )

i = i + 1;

if rem(i,100) == 0 % rem- остаток от деления; например, rem(7,2)=1

ans = input( 'Stop? Answer=', 'S' );

if ans == 'y'

return

end

end

end

Здесь все значения промежуточных (частичных) сумм ряда выводятся функцией disp в командное окно системы MATLAB. Кроме того, через каждые 100 слагаемых функцией input выводится надпись, предписывающая пользователю ответить на вопрос, не пора ли останавливать вычисления (в этом цикле они бесконечные). Если в ответ пользователь вводит с клавиатуры латинский символ 'у', то вычисления прекращаются, так как выполняется оператор досрочного выхода из функции return.

Непосредственный ввод информации с клавиатуры и присвоение введенного значения переменной ans также осуществляется функцией input. В качестве второго аргумента (параметра) функции input используется символ 'S', означающий, что функция input должна принять символьные (а не числовые) значения.

Функция sprintf помещает в выходную строку значения своих выходных параметров в указанном формате (%d и %f). Этот формат полностью аналогичен формату, используемому в языке СИ; он также используется, например, с функцией fprintf, осуществляющей форматный вывод информации в текстовые файлы.

В результате разработанная функция позволяет пользователю полностью контролировать процесс вычислений, наблюдать за промежуточными результатами и прекращать вычисления по мере необходимости. Пример записи в командной строке количества членов ряда i для достижения текущей суммой ряда значения 10 (нужно просуммировать 12 367 членов ряда:

. . .

i=83 S= 5

. . .

i=12367 S = 10.000043

Для достижения значения 5 достаточно всего 83 слагаемых.

Для вывода предупредительных сообщений (удобное средство для отладки функций) вместо функции disp лучше использовать функцию warning (например, warning('msg')), так как ее вывод легко подавить из командного окна, выполнив команду

warning off

Возобновление вывода функцией warning предупредительных сообщений осуществляется командой

warning on

Если в теле М-функции присутствует код обнаружения тех или иных ошибочных ситуаций, то завершать выполнение М-функций в таких случаях целесообразно вызовом функции error, которая не только выполняет такое завершение абсолютно корректно, но и выводит поясняющее ошибку сообщение в командное окно системы MATLAB. Например, функция, вычисляющая величину, обратную к входному числовому скалярному параметру может иметь следующее содержание:

function у = Inverse ( х )

if x == 0

error( 'Division by zero' )

else

у = 1 ./ x;

end

Если входной параметр равен нулю, то выполняется функция error и в командном окне появляется сообщение “ Division by zero”.

Если требуется временно приостановить выполнение М-функции, чтобы, например, спокойно посмотреть и проанализировать промежуточную информацию, то следует в код функции вставить вызов функции pause (без входных параметров). Дальнейшее выполнение М-функции возобновляется после нажатия любой клавиши на клавиатуре.

Иногда удобно использовать функцию menu, реализующую наглядный графический ввод одного из альтернативных значений. Например, строка кода с вызовом функции menu может иметь вид:

n = menu('Enter your choice','Dog','Cat');

Эта строка вызывает появление на дисплее следующего окна:

Если пользователь нажмет левую клавишу мыши, указав на кнопку Dog, то переменная n получит значение 1, а если кнопку Cat, то переменная n станет равной 2. Таким образом, возвращаемое функцией menu числовое значение есть номер выбранного пользователем пункта из списка всех доступных вариантов (меню выбора). Это число может быть использовано в программе для обеспечения выбора соответствующей ветви вычисления, значения свойства и др. …

Специальным случаем интерактивного взаимодействия с пользователем является ввод имени функции или символьного представления выражения, подлежащих дальнейшему вычислению. В системе MATLAB для выполнения (вызова) функций, имя которых заранее неизвестно и содержится в качестве значения в текстовой строке, а также для вычисления выражений по их символьному представлению предназначены две специальные функции: eval и feval.

Примеры для функции eval :

Из примеров видно, что функция переводит строковый аргумент в числовую запись и исполняет ее.

Если в процессе работы функции eval возникнет ошибочная ситуация, то в командном окне системы MATLAB появится сообщение о характере ошибки.

В Matlab есть собственная функция MyErrorCatch для обработки ошибок, которые могут возникнуть в процессе выполнения функции eval [2, с. 189].

По сравнению с функцией eval, которая хорошо подходит для вычисления сложных выражений, функция feval более удобна для вычисления одиночной функции, которой при этом можно передать дополнительные параметры:

feval ( str, xl, x2,...,xN )

Здесь строка str задает имя функции, подлежащей вычислению при значениях аргументов xl, х2, ..., xN. Простой пример использования функции feval:

% знак “;” предотвращает вывод значения m

% ; можно не ставить для вывода значения х

Здесь после вывода функцией input запроса (“Enter function index:”) введено с клавиатуры целое число 2. По нему функция feval выбрала второй элемент массива ячеек FunName и вычислила значение sin (0.5), равное 0.4794.