|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Численные методы решения нелинейных алгебраических уравнений
Теорема Больцано-Коши о промежуточных значениях непрерывной функции утверждает, что если непрерывная функция принимает два значения, то она принимает и любое значение между ними. Следствие (теорема о нуле непрерывной функции): если непрерывная функция принимает на концах отрезка положительное и отрицательное значение, то существует точка, в которой она равна нулю.
Функция fzero позволяет приближенно вычислить корень уравнения на некотором интервале или ближайший к заданному начальному приближению. В простейшем варианте fzero вызывается с двумя входными и одним выходным аргументом
х = fzero ('func_name’, х0),
где func_name – ИМЯ файл-функции, вычисляющей левую часть уравнения, х0 – начальное приближение к корню, х – найденное приближенное значение корня.
Пример 1. Нахождение корней уравнения sin(x)-x*cos(x)= 0 на отрезке [-5, 5] Перед нахождением корней нужно построить график функции, входящей в левую часть уравнения. Задание 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
Задание 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 вывела сообщение об ошибке в командное окно.
Задание 3. Решите по два нелинейных алгебраических уравнения из табл. 1 с помощью функции fzero. Порядок выполнения задания 1. Для каждого из уравнений выполните е шаги 1-2. 1. Приравняйте уравнение к нулю, если это необходимо. 2. Постройте график левый части приравненного к нулю уравнения. 3. Выберете интервал локализации любого корня для первого уравнения. В контексте поиска корня нелинейного алгебраического уравнения интервал локализации – отрезок, на концах которого функция имеет разный знак. Кроме того, на этом отрезке функция должна быть монотонна. Данные условия, вытекающие из теоремы о нуле непрерывной функции, являются необходимыми и достаточными для существования единственного корня на отрезке. 4. Создайте inline функцию для левой части первого уравнения. 5. Вызовите функцию fzero, входными аргументами которой будут inline функция и интервал локализации. 6. Создайте анонимную функцию для левой части второго уравнения. 7. Вызовите функцию fzero, входными аргументами которой будут анонимная функция и произвольная точка в окрестности корня.
Табл. 1. К заданию 4.
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.007 сек.) |