Если в списке случайно пропущен хотя бы один из аргументов, то inline-функцией воспользоваться не удастся:
>> fun3=inline('sin(a*x)-x.^2.*cos(b*x)','x','b')
fun3 =
Inline function:
fun3(x,b) = sin(a*x)-x.^2.*cos(b*x)
Даже при наличии переменной а в рабочей среде вызов функции fun3 приведет к сообщению о том, что аргумент а не задан:
>> a=1;
>> fun3(5,0)
??? Error using ==> inlineeval at 15
Error in inline expression ==> sin(a*x)-x.^2.*cos(b*x)
Undefined function or variable 'a'.
Этот пример демонстрирует, что при вычислении значения встраиваемой функции переменные рабочей среды недоступны. Все аргументы функции inline должны быть символьными строками, заключенными в апострофы, или строковыми переменными. В противном случае получается недопустимая конструкция. Необходимо придерживаться простого правила — ставить апострофы в аргументах функции inline.
Альтернативный способ задания исследуемой функции состоит в объявлении анонимной функции с помощью оператора указателя @:
Имя_функции = @ (список_аргументов) формула
В отличие от inline-функции, и аргументы, и формула записываются в обычном виде, а не как текстовые строки в апострофах. Кроме того, анонимной функции доступны переменные рабочей среды, которые входят в формулу. Однако они являются константами, в качестве которых берутся значения этих переменных в момент создания анонимной функции, и последующее изменение их значений не будет учитываться при вычислении функции:
>> a=1;
>> gun3=@(x,b)(sin(a*x)-x.^2.*cos(b*x))
gun3 =
@(x,b)(sin(a*x)-x.^2.*cos(b*x))
>> gun3(5,0)
ans =
-25.9589
>> a=1000;
>> gun3(5,0)
ans =
-25.9589
По способу использования анонимная функция напоминает inline-функцию, но отличается тем, что создается указатель на функцию, который связан с исполняемым кодом. Это хорошо видно либо в окне Workspace, либо при выводе информации о функциях с помощью whos:
>> whos gun3
Name Size Bytes Class Attributes
gun3 1x1 16 function_handle
>> whos fun3
Name Size Bytes Class Attributes
fun3 1x1 910 inline
Информация о выделенной под функции памяти показывает, что для анонимной функции исполняемый код и указатель на нее отделены, а для inline-функции это единый объект.
Численные методы решения нелинейных алгебраических уравнений
Функция fzero позволяет приближенно вычислить корень уравнения на некотором интервале или ближайший к заданному начальному приближению.
В простейшем варианте fzero вызывается с двумя входными и одним выходным аргументом
х = fzero ( 'func_name’ , х0),
где func_name – ИМЯ файл-функции, вычисляющей левую часть уравнения,
х0 – начальное приближение к корню,
х – найденное приближенное значение корня.
Пример. Нахождение корней уравнения sin(x)-x*cos(x)= 0 на отрезке [-5, 5]
Перед нахождением корней нужно построить график функции, входящей в левую часть уравнения.
Задание 8.1. Создать файл-функцию myf(x), вычисляющую левую часть уравнения из примера 1. Построить график функции, входящей в левую часть уравнения, sin(x)-x*cos(x)= 0 на отрезке [-5, 5].
Уточните значение корня, расположенного вблизи х = - 5 , при помощи fzero:
x1=fzero('myf',-5)
x1 =
-4.4934
Итак, приближенное значение корня равно -4.7566. При указании начального приближения к корню алгоритм fzero автоматически отделяет корень, т. е. вблизи заданного начального приближения находится отрезок, содержащий корень. В этом случае fzero может использовать больший интервал определения функции, чем исходный отрезок [-5, 5].
Проверьте ответ, вычислив значение функции myf в точке xl
myf(x1)
ans =
1.1102e-016
Проверьте работу fzero, вычислив корень myf, расположенный вблизи нуля, там, где точное значение корня равно нулю.
x4=fzero('myf',0.1)
x4 =
-7.4135e-009
Задание 8.2. Найти корень х2, расположенный около точки 5.
Вместо начального приближения вторым параметром fzero можно задать интервал, на котором следует найти корень:
x2=fzero('myf',[-5 -1])
x2 =
-4.4934
Теорема Больцано-Коши о промежуточных значениях непрерывной функции утверждает, что если непрерывная функция принимает два значения, то она принимает и любое значение между ними.
Следствие (теорема о нуле непрерывной функции): если непрерывная функция принимает на концах отрезка положительное и отрицательное значение, то существует точка, в которой она равна нулю.
На границах указываемого интервала функция должна принимать значения разных знаков (см. теорему о нуле непрерывной функции), иначе выведется сообщение об ошибке!
В качестве исследуемой функции может выступать и встроенная математическая функция, например
fzero('sin', [2 4])
ans =
3.1416
Допустимы другие способы вызова fzero. Во-первых, функцию с исследуемой математической функцией можно задать при помощи указателя на нее:
>> x2=fzero(@myf,[-5 -1])
x2 =
-4.4934
Во-вторых, воспользовавшись функцией inline:
>> fun = inline('sin(x) - x.*cos(x)')
fun =
Inline function:
fun(x) = sin(x) - x.*cos(x)
>> xl = fzero(fun, -5)
xl =
-4.4934
В-третьих, создав анонимную функцию:
>> fun = @(x) sin(x)-x.*cos(x)
fun =
@(x)sin(x)-x.*cos(x)
>> xl = fzero(fun,-5)
xl =
-4.4934
Обращение к fzero с двумя выходными аргументами позволяет не только приближенно найти корень, но и получить значение функции в найденной точке.
>> [x2, f] = fzero(@myf, -2)
x2 =
6.2926e-009
f =
Важной особенностью fzero является то, что она вычисляет только те корни, в которых функция меняет знак, а не касается оси абсцисс. Найти корень уравнения х^2 = 0 при помощи fzero не удается:
>> fun=inline('х.^2');
>> x = fzero(fun, -0.1)
??? Error using ==> fzero at 301
FZERO cannot continue because user supplied inline object ==> fun
failed with the error below.
Error: The expression to the left of the equals sign is not a valid target for an assignment.
В данном примере fzero пыталась найти промежуток, на границах которого значения функции myf имеют различные знаки, что гарантировало бы существование корня на этом промежутке. Такой промежуток, естественно, определить не удалось, и fzero вывела сообщение об ошибке в командное окно.
Задание 8.3. Найдите любой из корней уравнения из табл. 8.1 несколькими способами и сравните результат.
Ход выполнения работы.
1. Приравняйте уравнение к нулю, если это необходимо.
2. Постройте график левый части приравненного к нулю уравнения.
3. Выберете интервал локализации любого корня для уравнения. В контексте поиска корня нелинейного алгебраического уравнения интервал локализации – отрезок, на концах которого функция имеет разный знак. Кроме того, на этом отрезке функция должна быть монотонна. Данные условия, вытекающие из теоремы о нуле непрерывной функции, являются необходимыми и достаточными для существования единственного корня на отрезке.
4. Создайте inline функцию для левой части уравнения.
5. Вызовите функцию fzero, входными аргументами которой будут inline функция и интервал локализации.
6. Создайте анонимную функцию для левой части уравнения.
7. Вызовите функцию fzero, входными аргументами которой будут анонимная функция и произвольная точка в окрестности корня.