русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Численные методы решения нелинейных алгебраических уравнений


Дата добавления: 2015-06-12; просмотров: 948; Нарушение авторских прав


 

Приборы и оборудование:

– компьютер, с установленной операционной системой Windows XP, Vista, 7, 8;

Matlab (ver 6.0 и выше)

 



Цели работы:

1. Изучение работы с анонимными и встраиваемыми функциями.

2. Решение нелинейных алгебраических уравнений с помощью функции fzero.

3. Разработка алгоритмического и программного обеспечения решения нелинейных алгебраических уравнений методами бисекций и Ньютона.

Продолжительность: 6 академических часов.

 



Содержание работы:

1. Изучить методы работы с анонимными и встраиваемыми функциями.

2. Разработать программное обеспечение решения нелинейных алгебраических уравнений методом бисекций в среде Matlab.

3. Выполнить практические задания и сделать соответствующие выводы.

4. Оформить отчет.

 



Форма отчетности: индивидуальный отчет в электронном виде с типовым титульным листом в формате MS Word с последующей распечаткой на бумажном носителе.

 



Содержание отчета:

1. Цель работы.

2. Текст задания.

3. Результат выполнения задания (необходимые расчеты, блок-схемы, тексты и результаты работы программ).

4. Выводы в развернутой форме с соответствующими пояснениями.

 



 



Длительность работы: 4 академических часов.

 



Защита работы: собеседование с преподавателем по контрольным вопросам и выполнение индивидуальных заданий.

 



Встраиваемые и анонимные функции

Встраиваемая функция определяется при помощи функции inline, обращение к которой выглядит следующим образом:

 



Имя_функции = inline('формула', список_аргументов)

 



Список аргументов не обязателен, а 'формула' является текстовой строкой и задает выражение для вычисления значения функции.

Следующий пример демонстрирует создание в рабочей среде встраиваемой функции fun:

 



>> fun=inline('sin(x)-x.^2.*cos(x)')

fun =

Inline function:

fun(x) = sin(x)-x.^2.*cos(x)

 



Inline-фунция fun может быть использована как любая другая функция MATLAB, например:

 



>> y=fun(0.5)

 



y =

0.2600

 



Если функция зависит от нескольких переменных, то все они являются аргументами введенной inline-функции и располагаются в алфавитном порядке:

 



>> fun1=inline('sin(a*x)-x.^2.*cos(b*x)')

 



fun1 =

Inline function:

fun1(a,b,x) = sin(a*x)-x.^2.*cos(b*x)

 



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

 



>> fun2=inline('sin(a*x)-x.^2.*cos(b*x)','x','a','b')

 



fun2 =

Inline function:

fun2(x,a,b) = sin(a*x)-x.^2.*cos(b*x)

 



Если в списке случайно пропущен хотя бы один из аргументов, то 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, входными аргументами которой будут анонимная функция и произвольная точка в окрестности корня.

 



Табл. 8. 1. К заданию 8.3.

ln(x)+(x+1)3=0
x×2x=1
x+cos(x)=1
x+lg(1+x)=1.5
lg(2+x)+2x=3
2x+5x-3=0
5x+3x =0
3ex=5x+2
5x=6x+3
2ex+5x-6=0
2arctg(x)-x+3=0
(x-3) × cos(x)=1
xx= 20-9x
x × lg(x)=1
tg3x=x-1
5x =1+e-x
5x =3-ex
arctg(x2+1/x)=x
tg(0.55x+0.1)=x2
5x-6x =7
5x-6x =3
5x =1+e-2x
7x-6x =2
5x =2+e-2x
x×2x=3

 



<== предыдущая лекция | следующая лекция ==>
Прямой ход решения СЛАУ методом Гаусса | Метод бисекции (метод деления отрезка пополам)


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.997 сек.