Лекции по Matlab

Автор: Пользователь скрыл имя, 12 Ноября 2010 в 00:08, курс лекций

Описание работы

Переменные рабочего пространства. Арифметические выражения. Типы данных. Скрипты и функции. Операторы MATLAB. Работа с файлами. Работа с текстовыми файлами.

Работа содержит 1 файл

Лекции по MATLAB.doc

— 650.00 Кб (Скачать)

    function y=f1(z)

      y=z*exp(-z)+sin(z) 

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

     >> [x, f]=fzero('x.*exp(-x)+sin(x)',[3, 4])

     x =

         3.2665

     f =

       2.0817e-016 

     Иногда, например, при нахождении корня уравнения tg(x)=0 функция fzero выдает неожиданный результат:

     >> [x, f]=fzero('tan(x)',[1, 2])

     x =

         1.5708

     f =

      -1.2093e+015

     Судя  по значению функции найденный x не является корнем. 

     Полный  формат использования функции fzero:

     [x, f, e_flag, inform]=fzero(fun, x0)

Если  e_flag = 1, то удалось найти интервал, на концах которого функция fun меняет знак и e_flag=-1 в противном случае. Структура inform содержит 3 поля с информацией о числе итераций, выполненных при поиске корня, количестве обращений к функции fun, алгоритме, использованном для решения.

     >> [x, f, e_flag, inform]=fzero('x.*exp(-x)+sin(x)',[3, 4])

     x =

         3.2665

     f =

       2.0817e-016

     e_flag =

          1

     inform =

         iterations: 8

          funcCount: 8

          algorithm: 'bisection, interpolation' 

     Для алгоритма, примененного в fzero принципиальным является принятие функций значений разных знаков на концах интервала. Например, уравнение x2=0 не может быть решено с помощью fzero (если не указать в качестве приближения явно 0). 

     Решение систем нелинейных уравнений 

     Для решения систем нелинейных уравнений  вида F(x)=0 предназначена функция fsolve. Здесь x – вектор или матрица неизвестных, F – функция, значением которой является вектор или матрица.

     Алгоритм  работы fsolve использует начальное приближение x0 и базируется на минимизации суммы квадратов компонент функции F методами Гаусса-Ньютона и Левенберга-Марквардта.

     Простейшее  использование: x=fsolve(F,x0). В частности fsolve можно использовать вместо функции fzero для нахождения корня единственного нелинейного уравнения:

     >> x=fsolve('sin(x)',0.1)

     В MATLAB существует 2 версии данной функции, поэтому при подобном кратком вызове fsolve будет выведна на несколько строчек пояснительная информция с предложением выбора одной из версий функции с помощью более точного указания аргументов (для поиска корня в этом случае будет использована более свежая версия fsolve). Для этого необходимо использовать 3 параметр:

     x=fsolve('sin(x)',0.1,optimset('Display','off'))

     x =

       1.2495e-011 

     С помощью функции optimset задаются свойства (параметры), влияющие на ход итерационных процессов (оптимизации, минимизации). Задание значения любого из свойств производится парой параметров, первый – наименование, второй – значение:

     options=optimset('Name1',Val1,'Name2',Val2,…);

     x=fxxx(fun, x0,…, options);

     В вышеописанном примере был установлен режим отображения информации о  шагах итерационного процесса (Display). Он может быть off (вывод отключен), iter (вывод на каждой итерации), notify (вывод в случае необходимости), final (финальный вывод). 

     Рассмотрим  пример решения следующей системы  уравнений:

     Объявим в m-файле функцию funcsc, значения которой сформируем в виде вектора-столбца:

     function y=funcsc(x)

       y=[x(1)+x(2)-sin(pi*x(1));x(1)-x(2)-cos(pi*x(2))];

     Далее вызов fsolve

     >> [x, f]=fsolve(@funcsc,[0.2;1],optimset('Display','off'))

     x =

         0.3915

         0.5510

     f =

       1.0e-005 *

         0.9147

        -0.0339

     Если  вызвать fsolve с нулевым приближением -1 и -2, то, судя по возвращаемому значению f, процедура поиска попала в локальный минимум:

     >> [x, f]=fsolve(@funcsc,[-1;-2],optimset('Display','notify'))

     Optimizer is stuck at a minimum that is not a root

     Try again with a new starting guess

     x =

        -0.4595

        -1.6778

     f =

        -1.1454

         0.6883 

     Задача для самостоятельной работы: Построить графики функций (x2=sin(pi*x1)-x1 и x1=cos(pi*x2)+x2) и найти все корни системы. 

>> hold on

>> x1=-1:0.1:1.5;y=sin(pi*x1)-x1;plot(x1,y,'k-');

>> x2=-1:0.1:1.5;y=cos(pi*x2)+x2;plot(y,x2,'k:');

>> xlabel('x1'); ylabel('x2'); 

Ответ: 5 корней.

Рис. 8. Графики  функций

 

     Численное дифференцирование  функции одной  переменной 

     Производная – понятие локальное. Поэтому, если функция задана таблицей значений, для нахождения ее производной в каком-либо из узлов обычно используют интерполяционные многочлены невысоких степеней, хорошо приближающие функцию в окрестности этого узла. Для построения таких многочленов используют формулы, основанные на таблицах разностей. Наиболее известны интерполяционные формулы Ньютона.

     Конечные  разности

     Пусть на оси абсцисс отмечены узлы x1, x2, …, xn и функция задана таблицей значений yi=f(xi).

     Таблицы разностей:

Δx1=x2-x1 Δx2=x3-x2 Δxn-1=xn-xn-1
Δy1=y2-y1 Δy2=y3-y2 Δyn-1=yn-yn-1

     Если  узлы равноотстоящие, то составляются также разности 2, 3 и т.д. порядков:

Δ2y1= Δy2-Δy1 Δ2y2= Δy3-Δy2 Δ2yn-2= Δyn-1-Δyn-2
Δ3y1= Δ2y22y1 Δ3y2= Δ2y32y2 Δ3yn-3= Δ2yn-22yn-3
 

     В MATLAB функция diff строит по заданному вектору x вектор разностей указанного порядка:

     dx=diff(x) %разности 1-го порядка

     dx=diff(x,n) %разности n-го порядка

     Например, для функции y=log(x) составим разности первого и второго порядка:

     >> x=1:0.1:2;

     >> dx=diff(x);

     >> y=log(x);

     >> dy=diff(y);

     >> d2y=diff(y,2); 

     Пусть узлы в которых заданы значения функции  равноотстоящие: Δx1=Δx2=…=Δxn=h. Тогда можно построить интерполяционные формулы, позволяющие приближенно находить значения функции вблизи произвольного узла xi (q=( x- xi)/h).

     Формулы Ньютона 1 порядка (линейное приближение):

     y=f(x)~yi+q*Δyi (интерполяция вперед)

     y=f(x)~yi+q*Δyi-1 (интерполяция назад)

     Формула Ньютона 2 порядка (квадратичное приближение):

     y=f(x)~yi+q*Δyi+(q*(q-1)*Δ2yi)/2! (интерполяция вперед)

     y=f(x)~yi+q*Δyi-1+(q*(q+1)*Δ2yi-2)/2! (интерполяция назад)

     Формул  Стирлинга 1 порядка (линейное приближение):

     y=f(x)~yi+q*(Δyi-1 + Δyi)/2

     Формул  Стирлинга 2 порядка (квадратичное приближение):

     y=f(x)~yi+q*(Δyi-1 + Δyi)/2 + q22yi-1/2!

     Если  продифференцировать полусумму формул Ньютона 1-го порядка для интерполяции вперед и назад или формулу Стирлинга 1-го порядка, то получим:

     f'(xi)= (Δyi-1 + Δyi)/(2h)= (yi+1 - yi-1)/(2h)

     (Для  концевых узлов i=1 и i=n данная формула неприменима, в этом случае приходится применять по отдельности формулы Ньютона, желательно более высокого порядка:

     f'(xi)= (Δy1 - Δ2y1/2)/h= (-3y1 + 4y2 - y3)/(2h)

     f'(xn)= (Δyn-1 - Δ2yn-2/2)/h= (3yn - 4yn-1 + yn-2)/(2h) 

     Задача: Вычислить значения производной функции log(x) в узлах сетки аналитически и по вышеприведенным формулам.

     function [f, dev]=der

     h=0.1;

     x=1:0.1:2;

     y=log(x);

     j=1;

     fy=x.\1;

     f(j)=(-3*y(1)+4*y(2)-y(3))/2/h;

     j=j+1;

     for i=1.1:0.1:1.9

         f(j)=(y(j+1)-y(j-1))/2/h;

         j=j+1;

     end

     f(j)=(3*y(j)-4*y(j-1)+y(j-2))/2/h;

     dev=fy-f;

f =

  Columns 1 through 7

    0.9946    0.9116    0.8353    0.7708    0.7155    0.6677    0.6258

  Columns 8 through 11

    0.5889    0.5561    0.5268    0.4991

>> dev

dev =

  Columns 1 through 7

    0.0054   -0.0025   -0.0019   -0.0015   -0.0012   -0.0010   -0.0008

  Columns 8 through 11

   -0.0007   -0.0006   -0.0005    0.0009

 

     Численное интегрирование 

     В основе всех способо численного интегрирования  (вычисления площади криволинейной  трапеции, расположенной под графиком заданной функции) лежит суммирование значений функции в некоторых узлах, причем значения берутся с определенными весами, зависящими от положения узлов на отрезке интегрирования.

     Простейшая  формула численного интегрирования с равноотстоящими узлами – формула  трапеций:

     

     Она является точной для линейных функций (из вида остаточного члена).

     Для вычисления интеграла по этой формуле  в MATLAB используется функция trapz.

     >> x=1:0.1:2;

     >> y=log(x);

     >> trapz(x,y)

     ans =

         0.3859

     Для сравнения точное значение интеграла  равно 0.3863.

     Для функции trapz узлы могут быть и не равноотстоящими:

Информация о работе Лекции по Matlab