
- •Практикум по курсу «численные методы»
- •Введение
- •Знакомство с системой Maple.
- •Объекты, типы переменных
- •Команды Maple
- •Выражения
- •Список пакетов и библиотек
- •Пакет для студентов student
- •Список имен математических функций
- •Вычисления и операции в maple.
- •Лабораторная работа №1 Tема: Решение уравнения c одной переменной
- •Задание 1
- •Расчетная формула для метода хорд:
- •Примерный вариант выполнения лабораторной работы на Maple
- •Численное решение уравнений
- •Лабораторная работа № 2 Тема: Решение систем линейных уравнений
- •Примерный вариант выполнения лабораторной работы на maple
- •Контрольные вопросы
- •Лабораторная работа №3 Тема: Интерполирование функций
- •Задание 1
- •Задание 2
- •Задание 3.
- •Примерный фрагмент выполнения работы на maple.
- •Лабораторная работа №4 Тема: Численное интегрирование
- •Задание 1
- •Задание 2
- •Примерный фрагмент выполнения лабораторной работы на Maple
- •Лабораторная работа №5 Тема: Численное решение дифференциальных уравнений
- •Задание 1
- •Задание 2
- •Примерный фрагмент выполнения лабораторной работы на Maple
- •Лабораторная работа №6 Тема: Статистическая обработка опытных данных
- •Задание 1
- •Задание 2
- •Примерный фрагмент выполнения лабораторной работы
- •Лабораторная работа №7 Тема: Численное решение уравнений в частных производных
- •Задание 1
- •Решение уравнения теплопроводности в Maple
- •Литература
- •Содержание
- •(Лабораторная работа 4)….…………………………...…………….…… 30
- •Численное решение уравнений в частных производных
Задание 1
Сделать
отделение корней: графически и по
программе (точность
).
Задание 2
1. Провести уточнение корней методом половинного деления.
В
качестве начального приближения выберем
,
затем исследуем функцию на концах
отрезков
и
.
Выбирается тот отрезок, у которого
значение функции на концах имеет
противоположные знаки. Процесс
продолжается до тех пор, пока не выполнится
условие
.
Точность
принять равной
2. Сделать уточнение корней методом простой итерации.
Пусть
корни отделены и
содержит единственный корень. Уравнение
(1.1) приведем к итерационному виду:
(1.2)
где
функция
дифференцируема на
и для любого
.
Функцию
можно подобрать в виде
(1.3)
где
находится из условия
,
для
.
Последнее
условие гарантирует сходимость
итерационной последовательности
к корню
.
Условием окончания счета будем считать
выполнение неравенства
(1.4)
3.
Сделать уточнение корней методом хорд
или касательных (X, K в таблице 1.1) с
заданной точностью
.
Расчетная формула для метода хорд:
,
для метода касательных:
,
Значение
для метода хорд и начальная точка для
метода касательных выбирается из условия
выполнения неравенства
.
В
результате вычислений по этим формулам
может быть получена последовательность
приближенных значений корня
.
Процесс вычислений заканчивается при
выполнении условия
<
(
).
В каждом случае вывести на печать
количество итераций, необходимых для
достижения заданной точности.
Примерный вариант выполнения лабораторной работы на Maple
Отделяем корни графически
> y(x):=exp(-x)-0.5;
> plot(y(x),x=-1..3);
Решение с использованием команды solve
> solve(y(x),x);
Рассмотрим процедуру, в рамках которой вычисление корней уравнения вида f(x) = 0 осуществляется методом половинного деления интервала. Ниже приведен код процедуры DoublDiv), согласно которой находятся корни выражения ff. Переменная, относительно которой ищутся корни, а также интервал определяются равенством xint. Погрешность задается параметром epsilon.
> DoublDiv:=proc(ff,xint,epsilon)
> local x,a,b,c,f,i;
> x:=lhs(xint);
> a:=op(rhs(xint))[1];
> b:=op(rhs(xint))[2];
> f:=unapply(evalf(ff),x);
> if f(a)*f(b)>0 then print("Неверное введенный интервал");
> else if f(a)*f(b)<0 then
> while (abs(b-a)>epsilon and f(c)<>0)
> do
> c:=(a+b)/2;
> if f(a)*f(c)>0 then a:=c;
> else b:=c;
> end if;
> end do;
> else
> if f(a)=0 then c:=a;
> else c:=b;
> end if;
> end if;
> x=evalf(c);
> end if;
> end proc:
Основная часть кода данной процедуры нужна для отслеживания особых ситуаций, когда в процессе поиска решения на одном из этапов пробная точка случайно совпадает с корнем. Однако прежде выполняется ряд инициализаций. Так, локальная переменная х определяется как левая часть равенства xint, указанного параметром процедуры. Переменным а и b присваиваются в качестве значений левая и правая границы диапазона, на котором ищется корень. А переменная f определяется как функциональная зависимость, соответствующая выражению, для которого ищутся корни.
Ниже приведены результаты использования разработанной процедуры для выражения.
> F:=exp(-t)-0.5;
> DoublDiv(F,t=0..3,0.000001);
Процедура для вычисления корней уравнения методом секущих может быть получена из процедуры вычисления корней методом половинного деления, если заменить оператор присваивания значения переменной с и условие проверки точности. В качестве верхней границы для точности результата может быть выбран модуль отношения значения функции в точке предполагаемого решения (в процедуре — это f (с)) и минимального значения для производной этой функции на рассматриваемом интервале (параметр М). Вот код для этой процедуры.
> khorda:=proc(ff,xint,epsilon,M)
> local x,a,b,c,f,i;
> x:=lhs(xint);
> a:=op(rhs(xint))[1];
> b:=op(rhs(xint))[2];
> f:=unapply(evalf(ff),x);c:=b-f(b)*(b-a)/(f(b)-f(a));
> if f(a)*f(b)>0 then print("Неверное введенный интервал");
> else if f(a)*f(b)<0 then
> while (abs(f(c)/M)>epsilon and f(c)<>0)
> do
> if f(a)*f(c)>0 then a:=c;
> else b:=c;
> end if;c:=b-f(b)*(b-a)/(f(b)-f(a));
> end do;
> else
> if f(a)=0 then c:=a;
> else c:=b;
> end if;
> end if;
> x=evalf(c);
> end if;
> end proc:
> F1:=exp(-t)-0.5;
Теперь воспользуемся процедурой khorda(), предварительно оценив, что производная для Fl(x) по абсолютной величине меньше ехр(-3) на рассматриваемом интервале быть не может. Эту величину, преобразованную в формат числа с плавающей точкой, и указываем последним параметром процедуры khorda().
> khorda(F1,t=0..3,0.000001,evalf(exp(-3)));
Как видим, результаты в пределах погрешности полностью совпадают.