Отчёт КР2. 1. Решение уравнений с одной переменной 3
Скачать 33.07 Kb.
|
Министерство науки и высшего образования Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего образования ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР) Кафедра компьютерных систем в управлении и проектировании (КСУП) Отчёт по контрольной работе № 2 по дисциплине «Вычислительная математика» Томск – 2021 Оглавление1.Решение уравнений с одной переменной 3 1.1.Задание 3 1.2.Теоретический материал (метод золотого сечения) 4 1.3.Алгоритм решения 4 1.4.Результаты работы программы 5 Выводы 6 Список использованных источников 7 Приложение А. Листинг программы 8 Решение уравнений с одной переменнойЗаданиеНаписать программу отделения корней и их уточнения одним из нижеперечисленных методов: методом дихотомии; методом хорд; методом золотого сечения; методом Ньютона; методом итераций; комбинированным методом Входные данные: функция f(x) и её первая и вторая производные (для метода Ньютона, итераций и комбинированного метода); интервал [a, b]; точность по аргументу и по функции ε1, ε2. Выходные данные: корни ξi, точность; значения f(ξi); количество итераций n; количество вычислений функции f(x); время счета; параметр сходимости , где n – порядок сходимости. Вариант 7: Теоретический материал (метод золотого сечения)Метод золотого сечения относится к интервальным методам (или методам исключения интервалов). Точки деления интервала выбираются таким образом, чтобы выполнялось соотношение между интервалами: где – золотое сечение, Δk = bk – ak – длина отрезка. Алгоритм решенияПредставим алгоритм поиска нулей в форме последовательного выполнения итераций. Задаём точки a1 = a, b1 = b, номер итерации k = 1. Шаг 1. Определяем координаты золотого сечения: Вычисляем точку Шаг 2. Вычисляем значения функции f(ak), f(ck), f(dk), f(bk) и проверяем условия: а) если f(ak) ·f(dk) ≤ 0, то ak+1 = ak; bk+1 =dk; б) иначе если f(ck) ·f(bk) ≤ 0, то ak+1 = ck; bk+1 =bk; Вычисляем новое приближение корня . Если , то конец, иначе k = k + 1 и переход на шаг 1. Скорость сходимости линейная с коэффициентом α = γ – 1. Результаты работы программы
ВыводыВ ходе выполнения данной контрольной работы были изучены методы решения уравнений одной переменной, написана реализация алгоритма решения задачи методом золотого сечения на языке программирования C++. Список использованных источниковБахвалов, Н. С. Численные методы : учеб. Пособие для вузов / Н. С. Бахвалов, Н.П. Жидков, Г. М. Кобельков. – М. : БИНОМ. Лаборатория знаний, 2011. – 637 с. Мицель, А. А. Вычислительные методы : учеб. Пособие / А. А. Мицель. – Томск : В-Спектр, 2010. – 264 с. Мицель, А. А. Практикум по численным методам / А. А. Мицель. – Томск : ТУСУР, 2004. – 196 с. Романенко, В. В. Вычислительная математика. Лабораторные работы / В. В. Романенко. – Томск : ТУСУР, 2006. – 114 с. Самарский, А. А. Задачи и упражнения по численным методам / А. А. Самарский, П. Н. Вабишевич, Е. А. Самарская. – М. : Эдиториал УРСС, 2009. – 208 с. Образовательный стандарт вуза ОС ТУСУР 01–2013. Работы студенческие по направлениям подготовки и специальностям технического профиля. Общие требования и правила оформления [Электронный ресурс] / А. А. Чернышев. – Томск : ТУСУР, 2013. – 57 с. – Режим доступа: https://regulations.tusur.ru/documents/70 (дата обращения: 20.04.2021). Приложение А. Листинг программы#include #include #include #include using namespace std; // функция f(x), вариант 7 int fc = 0; double f(double x) { fc ++; return x * sin(x) - 1; } // вычисление корня уравнения методом золотого сечения void GoldenSection(double a0, double b0, double eps1, double eps2) { // значение отношения золотого сечения const double gama = (sqrt(5) + 1) / 2; double a = a0, b = b0, c, d, delta; double x = (a + b) / 2; bool f1, f2; int k = 0; // засекаем время начала вычислений __int64 freq, start, stop; QueryPerformanceFrequency((LARGE_INTEGER *)&freq); QueryPerformanceCounter((LARGE_INTEGER *)&start); // алгоритм нахождения корня do { // шаг 1 delta = b - a; d = a + delta / gama; c = a + delta / pow(gama, 2); // шаг 2 if (f(a) * f(d) <= 0) b = d; else a = c; x = (a + b) / 2; // проверяем условия достижения точности f1 = ((b - a) / 2 < eps1); // по аргументу f2 = (fabs(f(x)) < eps2); // по значению функции k ++; } while (!(f1 && f2)); // засекаем вреия завершения вычислений QueryPerformanceCounter((LARGE_INTEGER *)&stop); double t = ((double)(stop - start) / freq) * 1000; // вывод результатов cout << "Корень уравнения: " << x << endl; cout << "Точность по аргументу: " << (b - a) / 2 << endl; cout << "Точность по функции: " << fabs(f(x)) << endl; cout << "Количество итераций: " << k << endl; cout << "Количество вычислений функции f(x): " << fc - 1 << endl; cout << "Время счёта (мс): " << t << endl; cout << "Параметр сходимости: " << gama - 1 << endl; } int main(int argc, char** argv) { setlocale(LC_ALL, "Russian"); double a, b, eps; cout << "a = "; cin >> a; cout << "b = "; cin >> b; cout << "eps = "; cin >> eps; GoldenSection(a, b, eps, eps); return 0; } |