@Gootya2

Как структурировать код?

Нужно найти корни уравнения с помощью метода дихотомий.
Есть простой код (да и в инете много примеров). Хочу автоматизировать код, чтобы не писать каждый раз одно и то же, когда корней много (в моём случае 5; программа для случая с 3 корнями). В C++ новичок. Прошу помощи
double f21(double x, double N)
{
	return 0.2 * (x + 2) + sqrt(N) * sin(x) + (4 * sin(3 * x)) / 3; // функция для расчётов (тут 5 корней)
}

void funck2()//решение задачи 2
{

	//С помощью первой задачи мы получили текстовый файл, который можно посмотреть
	//и проанализировать по полученным точкам поведение нашей функции, чтобы примерно представить
	//где будут находиться наши корни, воспользуемся этими знаниями для решения задачи 2:

	cout << "Task 2. We need to find all the roots of the function f(x) with a given step:\n\n";
	double x = a;//начальное положение точки Х
	double epsilon = 0;
	double eps = 0.0001;
	double c, d;//точки, близлежащие к f(x) = 0, относительно которых мы найдем корни функции
	while (f21(x, n) < 0) x += h;//находим ближайшую точку Х к оси ОХ, но при которой f(x) < 0
	c = x - h;
	cout << "f(" << c << ")= " << f21(c, n) << "\n";
	d = x + h;
	cout << "f(" << d << ")= " << f21(d, n) << "\n";//точки c и d это те точки, близкие к нулю, при которых f(c)*f(d) < 0
	while (((d - c) >= eps) | (f21(epsilon, n) >= eps))//цикл поиска корней методом дихотомии
	{
		epsilon = (c + d) / 2;//деление отрезка на пополам
		if (f21(c, n) * f21(epsilon, n) < 0) d = epsilon;//3 условия для нахождения корня
		if (f21(c, n) * f21(epsilon, n) > 0) c = epsilon;
		if (f21(epsilon, n) == 0) break;
	}
	x = epsilon;//выводим Х равный нашему корню
	cout << "X1: " << "f(" << x << ")=" << f21(x, n) << "\n\n";//вывод первого корня

	x = d;//для первого корня мы получили, что f(c)<0, f(d)>0 и нашли корень, теперь надо найти точки Х ближайшие к нулю ф-ии
	// при которых функция переходит из положительной в отрицательную область
	while (f21(x, n) > 0) x += h;
	c = x - h;
	cout << "f(" << c << ")= " << f21(c, n) << "\n";
	d = x + h;
	cout << "f(" << d << ")= " << f21(d, n) << "\n";
	while (((d - c) >= eps) | (f21(epsilon, n) >= eps))
	{
		epsilon = (c + d) / 2;
		if (f21(c, n) * f21(epsilon, n) < 0) d = epsilon;
		if (f21(c, n) * f21(epsilon, n) > 0) c = epsilon;
		if (f21(epsilon, n) == 0) break;
	}
	x = epsilon;
	cout << "X2: " << "f(" << x << ")=" << f21(x, n) << "\n\n";//вывод второго корня

	x = d;//теперь надо найти корень в области, когда функция снова переходит из отрицательной в положительную область
	while (f21(x, n) < 0) x += h;
	c = x - h;
	cout << "f(" << c << ")= " << f21(c, n) << "\n";
	d = x + h;
	cout << "f(" << d << ")= " << f21(d, n) << "\n";
	while (((d - c) >= eps) | (f21(epsilon, n) >= eps))
	{
		epsilon = (c + d) / 2;
		if (f21(c, n) * f21(epsilon, n) < 0) d = epsilon;
		if (f21(c, n) * f21(epsilon, n) > 0) c = epsilon;
		if (f21(epsilon, n) == 0) break;
	}
	x = epsilon;
	cout << "X3: " << "f(" << x << ")=" << f21(x, n) << "\n\n";//вывод третьего корня
}
  • Вопрос задан
  • 94 просмотра
Пригласить эксперта
Ответы на вопрос 1
@res2001
Developer, ex-admin
Одинаковые участки кода надо выделить в отдельные функции, передавать в функции нужные аргументы и возвращать результаты. Частично это у вас уже сделано с f21, но результат можно улучшить.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы