Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

MATLAB_Lab_all / Лабораторная работа 4 matlab

.pdf
Скачиваний:
65
Добавлен:
27.05.2015
Размер:
1.12 Mб
Скачать

Лабораторная работа №4

Использование MatLab\SciLab при решении задач вычислительной математики

Системы MatLab\SciLab обладают большими возможностями программирования и визуализации результатов научных исследований при решении задач вычислительной математики. Численные методы в этих системах предлагаются уже в виде готового инструментария — набора функций, их реализующих. Задачей данной работы является ознакомление с наиболее часто встречающимися на практике численными методами, которые используются при решении нелинейных уравнений, при аппроксимации и интегрировании функций.

1.Приближѐнное вычисление определѐнных интегралов.

Свычислением определѐнных интегралов самого общего вида:

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

В методе трапеций используется линейная интерполяция, т.е. подынтегральная функция заменяется кусочно-линейной, а еѐ график представляется в виде ломаной, соединяющей отдельные точки yi = f(xi), где xi – координаты узлов сетки, введѐнной на интервале интегрирования. При этом, очевидно, на каждом из интервалов от xi до xi+1 искомые площади вычисляются как площади обычных трапеций, после чего суммируются. В итоге формула трапеций при постоянном шаге сетки h = xi+1 - xi = (b - a)/n (n – число интервалов разбиения сетки) принимает вид:

Эта схема интегрирования чрезвычайно проста для реализации и имеет 2-ой порядок точности относительно шага сетки. Тем не менее, для экономии

времени пользователя в MatLab еѐ реализовали в виде функции trapz(x, y), а в SciLab – inttrap(x, y). Здесь x и y – массивы одного и того же размера 1хn, содержащие, соответственно, координаты узлов выбранной сетки и значения функции в этих узлах.

Не многим сложнее оказывается формула Симпсона 4-го порядка точности, получаемая при кусочной интерполяции подынтегрального выражения с помощью парабол:

В MatLab формула Симпсона реализуется функцией quad(fun, a, b [,tol]), где fun – подынтегральная функция, a, b – концы интервала интегрирования, tol – требуемая точность (необязательный параметр). Подынтегральная функция может быть предварительно определена в m-файле, тогда еѐ имя следует указать с дескриптором @, или еѐ можно указать непосредственно при вызове quad в виде текстовой строки, заключѐнной в одинарные кавычки. Например, вызов

quad(@myfun, 0, 1, 1e-3)

вычислит интеграл от myfun(x) на интервале [0, 1] с точностью 0.001. Файл функции myfun может быть примерно следующим:

function m = myfun(x)

m = x.*x;

return

Аналогично, производится интегрирование при непосредственном задании функции, например:

quad('x.*x', 0, 1, 1e-3).

Примечание: не забывайте, что операции умножения, деления и возведения в степень необходимо указывать в форме с «.», т.к. они производятся над массивами.

В SciLab интегрирование по схеме Симпсона производится функцией integrate(fun, x, a, b, [,er1 [,er2]]), где fun – функция, задающая

подынтегральное выражение в символьном виде, x – переменная интегрирования, также заданная в виде символа, a, b – пределы интегрирования, er1 и er2 – абсолютная и относительная точность (необязательные). Использовать внешнюю функцию в подынтегральном выражении можно, если производить интегрирование с помощью команды intg(a, b, name [,er1 [,er2]]), где name – имя внешней функции, задающей подынтегральное выражение, остальные параметры аналогичны параметрам функции integrate.

2. Численное решение нелинейных уравнений.

Пусть требуется найти корень уравнения f(x) = 0, где f(x) – некоторая функция, непрерывная на заданном интервале [a, b]. Часто f(x) является трансцендентной или вообще не имеет строгой математической формулы и задаѐтся некоторым сложным оператором. В таких случаях MatLab позволяет решить задачу приближено с помощью целого ряда функций, наиболее общей из которых является fzero, использующей известные численные методы дихотомии, секущей и обратной квадратичной интерполяции. Еѐ вызов имеет вид fzero(fun, x), где fun – символьное представление функции (выражение в кавычках) или внешняя функция пользователя (m-файл), а x – либо начальное приближение и тогда задаѐтся одним числом, либо отрезок, на котором предположительно имеется корень, и тогда задаѐтся в виде массива из двух элементов вида [а b]. Например, командой

fzero('sin(x)', [-1 2])

будет найден корень уравнения sin(x)=0 на отрезке [-1 2]. Если указан отрезок, на котором имеется несколько корней, то будет найден лишь один из них, и, кроме того, необходимо, чтобы на концах отрезка значения функции были разного знака. Во избежание ошибок рекомендуется предварительно произвести графическое исследование функции левой части уравнения, чтобы локализовать искомые корни.

Аналогичным образом обстоит дело и в SciLab. Функция для решения трансцендентных уравнений здесь имеет название fsolve(x0, fun), внешнее отличающаяся от версии MatLab лишь порядком параметров. При использовании символьной подстановки вместо функции требуется предварительно еѐ описать с помощью функции deff, например:

>> deff('[y]=fun(x)', 'y=x.*x-1')

>> fsolve(0.1, fun)

Отметим, что в пакете расширения MatLab Optimization toolbox имеется функция с тем же названием fsolve, с помощью которой можно найти все корни уравнения на заданном отрезке.

3. Аппроксимация функций

На практике часто приходится использовать табличные данные вида {xi, yi} для приближенного вычисления у при любом значении аргумента х. Этой цели служит задача о приближении (аппроксимации) функций: данную функцию f(x) требуется приближенно заменить некоторой функцией g(x) так, чтобы отклонение g(x) от f(x) в заданной области было наименьшим. Если приближение строится на заданном дискретном множестве точек {хi}, то аппроксимация называется точечной. К ней относятся интерполирование, среднеквадратичное приближение и др.

Для решения подобной задачи довольно часто используют сплайнинтерполяцию. Один из наиболее распространенных вариантов – интерполяция кубическими сплайнами. Кроме того существуют квадратичные и линейные сплайны. В MatLab интерполяция табличной функции одной переменной может быть произведена с помощью функции interp1(x, y, xi, method), где x, y – массивы одинакового размера 1хn, задающие исходную таблицу значений аргумента и функции, xi – массив 1xm, содержащий координаты точек, в которых необходимо найти значения функции, method – строковый параметр, определяющий способ интерполяции:

'nearest' – кусочно-постоянная интерполяция

'linear' - кусочно-линейная интерполяция

'spline'

- кусочно-непрерывная интерполяция кубическим сплайном

(по умолчанию)

'cubic'

- кусочно-непрерывная интерполяция кубическим полиномом

Например:

 

>>x = 0:10; y = sin(x); xi = 0:.25:10;

>>yi = interp1(x,y,xi);

>> plot(x,y,'o',xi,yi)

Коэффициенты сплайна в MatLab можно получить с помощью функции p = spline(x, y). При этом, p – является структурой с полями: form - строковый параметр (тип структуры), breaks - координаты узлов сплайна, coefs – искомые коэффициенты сплайна (матрица), pieces - количество интервалов, order – порядок, dim - размерность.

В Scilab для построения линейной интерполяции служит функция interpln(z, x), где z - матрица исходных данных, x – массив с координатами интересующих нас точек. Функция возвращает значения линейного сплайна в точках x. Например:

>>x=[132 140 150 162 170]; y=[330 350 385 425 450];

>>z=[x;y]; t=132:5:252;

>>ptd=interpln(z,t);

>>plot(t, ptd);

Построение кубического сплайна в SciLab состоит из двух этапов: вначале вычисляются коэффициенты сплайна с помощью функции d=splin(x,y), и только затем рассчитываются значения интерполяционного полинома в точках с абсциссами t с помощью функции у=interp(t, x, y, d). Эти функции имеют следующие параметры: x – строго возрастающий вектор, состоящий минимум из двух компонент, y – вектор того же размера, что и x, d – коэффициенты кубического сплайна, t – вектор абсцисс, y – вектор ординат, являющихся значениями кубического сплайна в точках t. Пример:

>>x=[0.43 0.48 0.55 0.62 0.7 0.75];

>>y=[1.63 1.73 1.87 2.03 2.22 2.35];

>>koeff=splin(x,y);

>>X=[0.702 0.512 0.608];

>>Y=interp(X,x,y,koeff); plot(X,Y);

>>t=0.43:0.01:0.75;

>>ptd=interp(t,x,y,koeff); plot2d(t,ptd);

Задания.

1. Найти значение определѐнного интеграла методами трапеций и Симпсона с заданной точностью, если:

2. Найти корень уравнения на заданном отрезке, выполнить проверку и построить график функции:

3. Для следующих табличных значений произвести интерполяцию и построить графики: