Раздел: Документация
0 ... 90 91 92 93 94 95 96 ... 365 Поскольку при создании анонимной функции переменные среды фиксируются, то нет смысла определять отдельно анонимную функцию и передавать ее имя в качестве аргумента, ибо для новых параметров все команды надо повторить. В листинге 6.4 приведен пример использования вложенных функций для решения той же задачи. Листинг 6.4. Использование функции, зависящей от параметра, в качестве аргумента fzero : function [х, у] = froot(pl, р2, хО) [х, у] = fzero(@pfun, хО); function f = pfun(x) f = exp{pl*x) - p2*sin(x); end Терерь вместо вызова функции fzero следует обращаться к собственной функции f root: » [х, у] = froot(0.1, 2,0) При необходимости можно добавить управляющую структуру options в список входных аргументов для передачи ее fzero. Пользователь пакета может выбрать наиболее приемлемый для него вариант. Этот раздел посвящен приближенному вычислению определенных интегралов и двойных определенных интегралов с заданной точностью. Пользователь имеет возможность выбирать наиболее подходящий метод численного интегрирования в зависимости от свойств подынтегральной функции. Вычисление определенных интегралов Начнем с примера нахождения значения определенного интеграла end х = 0.5570 У = и Интегрирование функций Первым шагом является создание функции, вычисляющей подынтегральное выражение, ее текст приведен в листинге 6.5. j Листинг 6.5. Файл-функция, вычисляющая подынтегральное выражение{ function f - fint(x) f = exp(-x>.*sin(x); Теперь для вычисления интеграла вызовите quad, задав первым аргументом ссылку на функцию fint, а вторым и третьим — нижний и верхний пределы интегрирования. В качестве выходного аргумента можно указать имя переменной, в которую следует записать найденное значение: » format long » I = guad(@fint, -1, 1) I = -0.66349146765310 Примечание Подынтегральная функция может быть задана именем, либо определена как inline-функция или анонимная так же, как и в случае fzero, fminsearch,fminbnd. k По умолчанию функция quad вычисляет приближенное значение интеграла с точностью 1(Н. Для изменения точности вычислений следует задать дополнительный четвертый аргумент: » I = quad(@fint, -1, 1, 1.0е-07) I = -0.66349366574399 Реализованный в quad рекурсивный алгоритм основан на квадратурной формуле Симпсона с автоматическим подбором шага интегрирования для достижения требуемой относительной погрешности. Сравнивая полученные результаты, можно сделать вывод, что относительная погрешностью-6 не дает ожидаемого количества верных знаков после десятичной точки. Проблема заключается в способе оценки погрешности вычислений в применяемом алгоритме, но этот вопрос из области вычислительной математики выходит за рамки излагаемого материала. При использовании средств пакета необходимо просто учитывать его особенности. Если пользователь знаком с теоретическими аспектами применяемого метода, то ему окажется полезной трассировка вычислений, которая выводится в командное окно при ненулевом значении пятого входного аргумента quad. Информация о ходе вычислений представлена в виде таблицы. В каждой ее строке приведены значе- ния количества вычислений подынтегральной функции, начальная точка текущего промежутка интегрирования, его длина и значение интеграла: » I = quad<@fint, -1, 1, 1.0е-07, 3) 9 11 13 15 -1.0000000000 -1.0000000000 -1.0000000000 -0.8642100000 5.43160000е-001 2.71580000е-001 1.35790000е-001 1.35790000е-001 -0.7696256630 -0.4927577867 -0.2772168074 -0.2155409801 37 39 41 0.4568400000 0.4568400000 0.7284200000 5.43160000е-001 2.71580000е-001 2.71580000е-001 0.1696814429 0.0830983395 0.0865830829 Проанализируйте количество точных знаков в зависимости от задаваемой точности вычислений в quadi для примера, разобранного выше. Функции quad и quadl могут выводить следующие диагностические сообщения: □Minimum step size reached — шаг интегрирования достиг минимального значения, но требуемая точность не получена. Возможно, функция имеет неинтегрируемую особенность; □Maximum function count exceeded — достигнут предел максимального количества вычислений значений подынтегральной функции (более 10 000). Возможно, функция ведет себя как функция с неинтегрируемой особенностью; □Infinite or Not-a-Number function value encountered—произошло переполнение при вычислении интегранда во внутренней точке интервала интегрирования. Например, при интегрировании функции у-х мую особенность, по отрезку [0,1] -0.9 , имеющей интегрируе- » fun = inline(х."-0.9) ; » I = quad(fun, 0, 1, le-7) Warning: Minimum step size reached; singularity possible. > In quad at 88 I = 9.8955 в командное окно выводится сообщение о достижении минимально возможного шага интегрирования, причем делается вывод о возможной осо- 0 ... 90 91 92 93 94 95 96 ... 365
|