Лабораторная работа 1 по ВМ. Московский технический университет связи и информатики
Скачать 260.74 Kb.
|
МОСКОВСКИЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ СВЯЗИ И ИНФОРМАТИКИ ОТЧЁТ по лабораторной работе №1 «Методы решения нелинейных уравнений» Отчёт подготовил: студент БСТ1401 Балашов И.М. Москва 2015 г. Нелинейное уравнение: e^x-4e^(-x)-1=0 Точность На компьютере: метод итерации. Вручную: метод хорд. Отделение корней График функции: x:=0.7, 0.8…1.7 Как видно только на промежутке х=[0.8;1] значение f(x) меняет знак, следовательно уравнение имеет хотя бы один корень. Из таблицы видно, что первая и вторая производные f'(x) и f''(x) знакопостоянны и непрерывны на всем отрезке.
Метод хорд (ручной расчёт): Для сходимости процесса необходимо, чтобы была знакопостоянна на , что и было доказано ранее. Рекуррентная формула метода хорд: где - неподвижная точка. За неподвижную точку в методе хорд выбирают тот конец отрезка [a;b], для которого выполняется условие f (x)∙ f¢¢ (x) > 0. В данном случае, исходя из таблицы, это будет точка b=1.7. Тогда рекуррентная формула будет иметь вид: Ручной расчет трех итераций: = 1.7 = 0,9062428 f(
После трех итераций приближение к корню . Оценка погрешности результатов: Метод итераций (машинный рассчет): Приведем уравнение к виду , тогда рекуррентная формула . Для сходимости процесса итерации необходимо, чтобы при Следовательно, сходимость не обеспечена. Тогда построим функцию: , где , так как , где возьмём , тогда Рекуррентная формула имеет вид: Схема алгоритма метода итераций: Код программы: #include #include #include using namespace std; double f(double x) { return exp(x)-4*exp(-x)-1; //исходное уравнение } double fi(double x) { return x - 0.05*f(x); //итерирующая функция } void rasschet(double x, double E) { double t = x; double f1, f2; int n = 0; //кол-во итераций do { x = t; t = fi(x); //получение очередного приближения к корню f1 = f(x); f2 = f(t); n = n + 1; cout << "\nитерация: " << n << " корень: " << x << " f(x):" << f(x); } while (!((abs(x - t) cout << "\nРезультаты:"; cout << "\nитерация:" << n << " корень:" << x << " f(x):" << f(x); } void main() { setlocale(LC_ALL, "Russian"); do{ cout << "Программа расчёта корня нелинейного уравнения методом итераций\n\n"; double x, E; cout << "Введите х: "; cin >> x; // начальное приближение cout << "Введите точность Е: "; cin >> E; //точность вычислений rasschet(x, E); } while (getch() == 'y'); } Результаты расчёта на ПК:
Зависимость числа итераций от точности в логарифмическом масштабе:
|