C/C++

Помогите с программой на c++

Пожалуйста:
Определить, пересекаются ли линии y=ax^3+bx^2+cx+d и y=kx+m. Если
пересекаются, найти точки пересечения.
Vlad Antonov
Vlad Antonov
511
Тут надо прежде всего выяснить вопрос о существовании корней полиномиального уравнения вида ax³+bx²+(c-k)•x+(d-m)=0.
При a≠0 это кубическое уравнение, которое всегда имеет хотя бы один вещественный корень, то есть в этом случае линии обязательно пересекаются, а абсциссы точек пересечения находятся из решения кубического уравнения в действительных числах.
Если a=0 и b≠0, то линии не пересекаются в случае (c-k)²<4b•(d-m), в остальном точки пересечения находятся из решения квадратного уравнения в действительных числах.
Если a=0, b=0, тогда при c≠k исходное полиномиальное уравнение вырождается в линейное, a при c=k линии пересекаются во всех своих точках если d=m и вообще не пересекаются если наоборот.
Короче, если писать качественный код, то он рискует оказаться слишком громоздким хотя бы из-за кучи ветвлений, обрабатывающих разные случаи входных значений переменных. Кроме того на весьма солидном множестве значений задаваемых переменных задача оказывается просто некорректной из-за ограниченной точности ЭВМ и как её тогда корректировать - это вопрос на миллион! Хотя можно, вообще-то, ограничиться лишь целыми входными данными, при которых компьютерное решение задачи будет проще реализовать.
Федор Ложкин
Федор Ложкин
66 572
Лучший ответ
Для определения, пересекаются ли две линии, необходимо решить систему уравнений, состоящую из уравнений этих двух линий.

y = ax^3 + bx^2 + cx + d (уравнение первой линии)
y = kx + m (уравнение второй линии)

Задача сводится к нахождению корней уравнения, полученного путем вычитания одного уравнения из другого:

ax^3 + bx^2 + cx + d = kx + m

Перенесем все члены уравнения на одну сторону:

ax^3 + bx^2 + (c - k)x + (d - m) = 0

Это уравнение имеет вид кубического уравнения и может быть решено с помощью формулы Кардано или других методов решения кубических уравнений.

Если уравнение имеет три различных вещественных корня, то две линии пересекаются в трех точках. Если уравнение имеет два различных вещественных корня, то две линии пересекаются в двух точках. Если уравнение имеет один вещественный корень, то две линии касаются друг друга. Если уравнение не имеет вещественных корней, то линии не пересекаются.

Пример кода на C++, который решает данную задачу с помощью формулы Кардано для решения кубических уравнений:

 #include  
#include

using namespace std;

int main()
{
double a, b, c, d, k, m;
cout a >> b >> c >> d >> k >> m;

double p = (-1.0 * b * b) / (3.0 * a * a) + c / a;
double q = (2.0 * b * b * b) / (27.0 * a * a * a) - (b * c) / (3.0 * a * a) + d / a - m;

double delta = q * q + 4.0 * p * p * p / 27.0;

if (delta > 0) // уравнение имеет три различных вещественных корня
{
double u = (-q + sqrt(delta)) / 2.0;
double v = (-q - sqrt(delta)) / 2.0;

double y1 = u - b / (3.0 * a);
double y2 = v - b / (3.0 * a);

double x1 = (y1 - m) / k;
double x2 = (y2 - m) / k;

cout
Sergiy Zelenyuk
Sergiy Zelenyuk
1 402
не знаю