Автор: Пользователь скрыл имя, 12 Ноября 2010 в 00:08, курс лекций
Переменные рабочего пространства. Арифметические выражения. Типы данных. Скрипты и функции. Операторы MATLAB. Работа с файлами. Работа с текстовыми файлами.
function y=f1(z)
y=z*exp(-z)+sin(z)
Для нахождения не только корня, но и значения функции в нем, можно обратиться к fzero с 2 выходными параметрами:
>>
[x, f]=fzero('x.*exp(-x)+sin(x)',[
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.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,
x =
1.2495e-011
С помощью функции optimset задаются свойства (параметры), влияющие на ход итерационных процессов (оптимизации, минимизации). Задание значения любого из свойств производится парой параметров, первый – наименование, второй – значение:
options=optimset('Name1',
x=fxxx(fun, x0,…, options);
В
вышеописанном примере был
Рассмотрим пример решения следующей системы уравнений:
Объявим в m-файле функцию funcsc, значения которой сформируем в виде вектора-столбца:
function y=funcsc(x)
y=[x(1)+x(2)-sin(pi*x(1));x(1)
Далее вызов fsolve
>>
[x, f]=fsolve(@funcsc,[0.2;1],
x =
0.3915
0.5510
f =
1.0e-005 *
0.9147
-0.0339
Если вызвать fsolve с нулевым приближением -1 и -2, то, судя по возвращаемому значению f, процедура поиска попала в локальный минимум:
>>
[x, f]=fsolve(@funcsc,[-1;-2],
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; >> x2=-1:0.1:1.5;y=cos(pi*x2)+x2; >> 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= Δ2y2-Δ2y1 | Δ3y2= Δ2y3-Δ2y2 | … | Δ3yn-3= Δ2yn-2-Δ2yn-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)*
y=f(x)~yi+q*Δyi-1+(q*(q+
Формул Стирлинга 1 порядка (линейное приближение):
y=f(x)~yi+q*(Δyi-1 + Δyi)/2
Формул Стирлинга 2 порядка (квадратичное приближение):
y=f(x)~yi+q*(Δyi-1 + Δyi)/2 + q2*Δ2yi-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) 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( 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 узлы могут быть и не равноотстоящими: