
- •2. Matlab.
- •2.8. Решение уравнений в Matlab.
- •2.8.1. Решение систем линейных уравнений [3, с.35, 125].
- •2.8.2. Поиск не комплексных корней уравнений (нахождение нулей функций) [1, с. 246; 3, с. 133].
- •2.8.2.1. Задание в функции fzero второго параметра в виде вектора.
- •2.8.2.2. Создание встраиваемой функции.
- •Inline function:
- •Inline function:
- •2.8.2.3. Использование анонимной функции.
- •2.8.2.4. Использование указателя @ при обращении к исследуемой м-функции.
- •2.8.2.5. Обращение к fzero с двумя выходными аргументами.
- •2.8.2.6. Обращение к fzero с тремя выходными аргументами.
- •2.8.3. Вычисление комплексных корней полиномов.
- •2.8.4. Нахождение экстремумов функций.
- •2.8.4.1. Минимизация функции одной переменной.
- •2.8.4.2.Минимизация функции нескольких переменных.
- •1.5000 0.5000 % Координаты искомой точки минимума
- •2.8.5.Обращение к файлам функций при решении и оптимизации уравнений [1, с. 243].
- •2.8.6. Решение систем нелинейных уравнений [1, с. 733].
2.8.2.3. Использование анонимной функции.
Альтернативный способ задания исследуемой функции состоит в объявлении анонимной функции с помощью оператора ссылки (@). Формат записи:
Имя_функции = @(список_аргументов) формула
В отличие от inline-функции, и аргументы, и формула записываются в обычном виде, а не как текстовые строки в апострофах. Кроме того, анонимной функции доступны переменные рабочей среды, которые входят в формулу. Однако они являются константами, в качестве которых берутся значения этих переменных в момент создания анонимной функции, и последующее изменение их значений не будет учитываться при вычислении функции:
» а = 1;
» gun3 = @(x, b) (sin(a*x) - х.^2.*cos(b*x))
gun3 =
@(х, b) sin(a*x) – x.^2 . *cos(b*x)
» gun3 (5, 0)
a n s =
-25.9589
» а = 1000;
» gun3 (5, 0)
ans =
-25.9589
По способу использования анонимная функция напоминает inline-функцию, но отличается тем, что создается указатель на функцию, который связан с исполняемым кодом. Это хорошо видно либо в окне Workspace, либо при выводе информации о функциях с помощью whos:
>> whos gun3
Name Size Bytes Class
gun3 lxl 16 function_handle array
Grand total is 1 element using 16 bytes
>> whos fun3
Name Size Bytes Class
fun3 lxl 908 inline object
Grand total is 79 elements using 908 bytes
Информация о выделенной под функцию памяти показывает, что для анонимной функции исполняемый код и указатель на нее отделены, а для inline-функции это единый объект.
Пример создания анонимной функции при решении уравнения с помощью функции fzero:
>> fun = @(х) sin(x) – х .^ 2 .* соs(х)
fun =
@(х) sin(x) - х .^ 2 .* соs(х)
>> xl = fzero(fun, -5)
x1 =
-4.7566 .
2.8.2.4. Использование указателя @ при обращении к исследуемой м-функции.
Допустим также следующий способ [1, с. 250] вызова fzero с использованием указателя @ на функцию (по другому здесь можно сказать “с использованием ссылки на функцию”):
»х2 = fzero(@myf, [-3 -1]);
х2 =
-1.8539
Вышеописанные способы задания исследуемых математических функций (по имени М-файла, в виде анонимной функции, с помощью inline-функции или с использованием указателя) допустимы во всех вычислительных алгоритмах MATLAB. Для достаточно простых исследуемых функций удобнее всего определить соответствующую inline или анонимную функцию. В то же время, если функция задана громоздким выражением, лучше всего написать соответствующий М-файл. А в случае, когда функция вычисляется по сложному алгоритму, это оказывается просто необходимым [1, глава 5, с. 223].
2.8.2.5. Обращение к fzero с двумя выходными аргументами.
При обращение к fzero с двумя выходными аргументами сразу выдаются значения и корня и функции после подстановки в нее этого корня:
» [х2, f] = fzero(@myf, -2)
х2 =
-1.8539
f =
-2.2204е-016
Важной особенностью fzero является то, что она вычисляет только те корни, в которых функция меняет знак, а не касается оси абсцисс. Найти корень уравнения x2 =0 при помощи fzero не удается:
» fun=inline( 'х.^2' );
» rezultat = fzero(fun, -0.1)
Exiting fzero: aborting search for an interval containing a sign change
because NaN or Inf function value encountered during search
(Function value at 1.372960e+154 is Inf)
Check function or try again with a different starting value.
rezultat =
NaN
В данном примере fzero пыталась найти промежуток, на границах которого значения функции myf имеют различные знаки, что гарантировало бы существование корня на этом промежутке. Такой промежуток, естественно, определить не удалось, и fzero вывела сообщение об ошибке в командное окно.