Лабораторная работа по "Вычислительной математике"
Автор: Валерий Агеев • Март 2, 2023 • Лабораторная работа • 1,322 Слов (6 Страниц) • 166 Просмотры
ГУАП
КАФЕДРА №
ОТЧЕТ
ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
должность, уч. степень, звание | подпись, дата | инициалы, фамилия |
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ № |
по курсу: ВЫЧИСЛИТЕЛЬНАЯ МАТЕМАТИКА |
РАБОТУ ВЫПОЛНИЛ
СТУДЕНТ ГР. № | |||||
подпись, дата | инициалы, фамилия |
Санкт-Петербург 2023
Цель работы:
а) освоение методов решения нелинейных уравнений;
б) совершенствование навыков по алгоритмизации и программированию вычислительных задач.
Постановка задачи:
Вариант для реализации решения – 2.
[pic 1]
Математическая часть: [pic 2]
[pic 3][pic 4]
[pic 5]
Аналитические расчеты:[pic 6]
Рисунок 1 – Ручной счет с помощью онлайн калькулятора (где x1 – это значение ф(x), а x – аргумент ф(x))
[pic 7]
Рисунок 2 – График начальной функции y(x)
Рисунок 3 – График функций y=x и y=ф(x)[pic 8]
Рисунок 4 – Метод итераций[pic 9]
Блок-схемы алгоритмов:
[pic 10]
Рисунок 5 – Блок-схема алгоритм функции FindSolution
[pic 11]
Рисунок 6 – Блок-схема алгоритм функции main
[pic 12]
Рисунок 7 – Блок-схема алгоритм процедуры InputOutput
[pic 13]
Рисунок 8 – Блок-схема алгоритм функции GetValueFromConsole
Код программы:
Таблица 1 – Код программы
#include <iostream> #define _USE_MATH_DEFINES #include <math.h> using namespace std; double GetValueFromConsole(string str); double FindSolution(double x, double a, double b, double c, double e); void InputOutput(); int main() { InputOutput(); } void InputOutput() { setlocale(LC_ALL, "Russian"); string inputConsole = ""; cout << "Enter value 0 (exit) or the other (continue): "; cin >> inputConsole; while (inputConsole != "0") { cout << "\n"; cout << fixed; cout.precision(4); cout << "Function is: f(x) = a * x + b * sin(x) + c" << "\n\n"; double a = GetValueFromConsole("a"); double b = GetValueFromConsole("b"); double c = GetValueFromConsole("c"); double e = GetValueFromConsole("e"); double x0 = GetValueFromConsole("x0"); double root = FindSolution(x0, a, b, c, e); double fx = a * root + b * sin(root) + c; cout << "Approximate root is: " << root << " | Accuracy epsilon = " << e << " | f(root) = " << fx << "\n\n"; cout << "Enter value 0 (exit) or the other (continue): "; cin >> inputConsole; } } double GetValueFromConsole(string str) { double i; cout << "Enter " << str << ": "; cin >> i; while (cin.fail()) { cout << "\nWrite " << str << " again. Incorrect input!\n\n"; cin.clear(); cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); cout << "Enter " << str << " again:"; cin >> i; } cout << "\n"; return i; } double FindSolution(double x, double a, double b, double c, double e) { double arg; double fx; int i = 0; cout << "Function ф(x) = (-b * sin(x) - c) / a" << "\n\n"; cout << "--------------------------" << "\n\n"; do { i++; arg = x; cout << "Iteration: " << i << " | Argument: " << arg; x = (-b * sin(x) - c) / a; fx = a * x + b * sin(x) + c; cout << " | Value: " << x << " | f(value) = " << fx << "\n\n"; } while (abs(arg - x) > e && i < 1000); cout << "--------------------------" << "\n\n"; if (i < 1000) { cout << "All iterations: " << i << "\n\n"; } else { cout << "All iterations: " << i << "\n\n" << "Unfortunately, the solution require very much iterations, so the root is not exact\n\n"; } return x; } |
...