Пожалуйста:
Определить, пересекаются ли линии y=ax^3+bx^2+cx+d и y=kx+m. Если
пересекаются, найти точки пересечения.
C/C++
Помогите с программой на c++
Тут надо прежде всего выяснить вопрос о существовании корней полиномиального уравнения вида 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 и вообще не пересекаются если наоборот.
Короче, если писать качественный код, то он рискует оказаться слишком громоздким хотя бы из-за кучи ветвлений, обрабатывающих разные случаи входных значений переменных. Кроме того на весьма солидном множестве значений задаваемых переменных задача оказывается просто некорректной из-за ограниченной точности ЭВМ и как её тогда корректировать - это вопрос на миллион! Хотя можно, вообще-то, ограничиться лишь целыми входными данными, при которых компьютерное решение задачи будет проще реализовать.
При a≠0 это кубическое уравнение, которое всегда имеет хотя бы один вещественный корень, то есть в этом случае линии обязательно пересекаются, а абсциссы точек пересечения находятся из решения кубического уравнения в действительных числах.
Если a=0 и b≠0, то линии не пересекаются в случае (c-k)²<4b•(d-m), в остальном точки пересечения находятся из решения квадратного уравнения в действительных числах.
Если a=0, b=0, тогда при c≠k исходное полиномиальное уравнение вырождается в линейное, a при c=k линии пересекаются во всех своих точках если d=m и вообще не пересекаются если наоборот.
Короче, если писать качественный код, то он рискует оказаться слишком громоздким хотя бы из-за кучи ветвлений, обрабатывающих разные случаи входных значений переменных. Кроме того на весьма солидном множестве значений задаваемых переменных задача оказывается просто некорректной из-за ограниченной точности ЭВМ и как её тогда корректировать - это вопрос на миллион! Хотя можно, вообще-то, ограничиться лишь целыми входными данными, при которых компьютерное решение задачи будет проще реализовать.
Для определения, пересекаются ли две линии, необходимо решить систему уравнений, состоящую из уравнений этих двух линий.
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++, который решает данную задачу с помощью формулы Кардано для решения кубических уравнений:
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
не знаю
Похожие вопросы
- Помогите написать программу на C++
- Помогите с программой на C++
- Помогите написать программу на C++
- ПОМОГИТЕ СОСТАВИТЬ ПРОГРАММУ НА C++.
- Помогите в программой в C++
- ПОМОГИТЕ НАПИСАТЬ ПРОГРАММУ НА C++
- Помогите написать программу на C++
- ПОМОГИТЕ НАПИСАТЬ ПРОГРАММУ НА C++ ИСПОЛЬЗУЯ ТОЛЬКО ЦИКЛЫ.
- Помогите написать программу на C++ Нето мои знания по программированию равны 0 а зачёт нужен
- Помогите с программой на c++