Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Бочарова А.А., Луппова Е.П., Ратников А.А. Вычи...doc
Скачиваний:
8
Добавлен:
01.07.2025
Размер:
4.77 Mб
Скачать

Задания для самостоятельного решения

  1. Решить уравнение для , и условия . Объяснить получившееся решение.

  2. Решить уравнение для , и условия . Объяснить получившееся решение.

Лабораторная работа № 2 Интерполяция функции полиномами Лежандра

Задача: Функцию cos(x) на интервале [-1,1] интерполировать с помощью полиномов Лежандра. Полиномы Лежандра подчиняются следующей рекуррентной зависимости:

,

Функцию будем интерполировать обобщенным полиномом: ,

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

Определение скалярного произведения .

Коэффициенты легко вычислить, если последовательно умножить скалярно обощенный полином на , например, на :

,

.

По свойству, определенному для , получим: .

> restart:

n:=5; – количество функций в наборе

c:=-1; – левая граница интервала

d:=1; – правая граница интервала

y(x):=cos(x); – функция для интерполяции

Создадим рекурсивную процедуру, вычисляющую полиномы Лежандра

> P:=proc(i)

if i=0 then 1

else if i=1 then x

else if i>1 then (x*(2*(i-1)+1)*P(i-1)-(i-1)*P(i-2))/(i)

fi fi fi

end proc:

Создадим набор нормированных функций

> for i from 0 to n do

f[i]:=P(i)/sqrt(int(P(i)^2,x=c..d))

od:

Найдем коэффициенты

> for i from 0 to n do

a[i]:=int(f[i]*y(x),x=c..d);

end do;

С помощью оператора цикла соберем функцию

> t(x):=0:

for i from 0 to n do

t(x):=t(x)+a[i]*f[i];

end do:

T(x)=t(x);

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

>

Графики y (x)- серый и t (x) - черный

plot([y(x),t(x)],x=c-1..d+1,color=[red,black],title="Графики y(x)-красный и t(x)-чёрный");

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

> evalf(%%);

Из графика очевидно, что для интерполяции функции cos(x) на интервале [-1,1] достаточно пяти членов суммы ряда.

Лабораторная работа № 3 Метод наименьших квадратов

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

Рассмотрим непрерывную функцию , аппроксимирующую дискретную зависимость . Выберем ее в следующем виде: , где – заранее определенные базисные функции.

– необходимое условие для заданной функции . N – количество точек в наборе. Нахождение функции из условия минимума S называется методом наименьших квадратов. S имеет минимум в следующем случае:

Если вынести неизвестные постоянные из сумм, а суммы, содержащие , перенести за знак равенства, получим следующую систему уравнений:

.

Для нашего случая выберем набор базисных функций . Экспериментальные данные будем приближать параболой. Таким образом, система уравнений приобретет вид:

.

Из нее получим коэффициенты , по которым построим параболу: .

> restart;

Сначала зададим набор данных в виде списков значений x и y.

x:=[-3,-2,1,3,6,7];

y:=[1,2,4,1,-3,1];

Спомощью функции nops посчитаем количество элементов в списке x.

n:=nops(x);

m:=3; – количество базисных функций. Найдем минимальное и максимальное значение x, для того, чтобы использовать это при построении графика. Присвоим значения правой и левой части интервала [a,b].

a:=min(x[i]$i=1..n);

b:=max(x[i]$i=1..n);

Определим процедуру, которая будет вычислять суммы, являющиеся коэффициентами системы уравнений. Условное ее значение

> scmult:=proc (f1,f2)

sum(x[p]^f1*y[p]^f2,p=1..n);

end proc;

Определим расширенную матрицу f, которая будет представлением системы уравнений:

> f:=matrix(m,m+1);

Заполним ее элементы значениями:

> for i from 1 to m do

for j from 1 to m do

f[i,j]:=scmult(i+j-2,0);

od:

od:

for i from 1 to m do

f[i,m+1]:=scmult(i-1,1)

od:

> evalm(f); – выведем матрицу в поле вывода

Решение будем искать с помощью метода Жордана-Гаусса, который реализует функция gaussjord из пакета linalg:

> fres:=linalg[gaussjord](f);

Выделим последний столбец расширенной матрицы, который является решением системы.

> res:=linalg[col](fres,m+1);

Переменной r[1] присвоим значение графика точек из заданного списка. Для построения списка используем оператор перечисления:

>r[1]:=plot([[x[p],y[p]]$p=1..n],style=point,symbol=circle,symbolsize=20,color=blue):

Переменной r[2] присвоим значение графика параболы, использующий коэффициенты решения.

r[2]:=plot(sum(res[k]*t^(k-1),k=1..m),t=a-0.1..b+0.1,thickness=3):

Отобразим результат обоих построений на общем графике.

> plots[display](r[1],r[2]);

Программа, описанная выше, является универсальной для метода наименьших квадратов. Изменяя переменную m можно, получить решение для любой степени большей нуля. Для того, чтобы проходила точно через все точки решения, необходимо чтобы m была равна количеству точек. Если заменить присвоение m на m:=n;, то получится следующий график: