Помогите с нахождением точек пересечения

Определите, пересекаются ли кривая у=аx3+bx2+сx+d и прямая y=fx+g. При положи-тельном ответе найти точки пересечения.
уравнение я решил , а как дальше не могу понять

    #include <iostream>
#include <math.h>
#define pi 3.14159
using namespace std;
int main()
{

    float a,b,c,d,D,r,s,t,p,q,ro,fi,x1,x2,x3,u,v,h,g;

cout<<"a="; cin>>a;
cout<<"b="; cin>>b;
cout<<"c="; cin>>c;
cout<<"d="; cin>>d;

    r=b/a; s=c/a; t=d/a;
p=(3*s-r*r)/3; q=2*r*r*r/27-r*s/3+t;
D=(p/3)*(p/3)*(p/3)+(q/2)*(q/2);
if (D<0)

{
ro=sqrt((float)(-p*p*p/27));
fi=-q/(2*ro);
fi=pi/2-atan(fi/sqrt(1-fi*fi));
x1=2*pow(ro,(float)1/3)*cos(fi/3)-r/3;
x2=2*pow(ro,(float)1/3)*
cos(fi/3+2*pi/3)-r/3;
x3=2*pow(ro,(float)1/3)*
cos(fi/3+4*pi/3)-r/3;
cout<<"\n x1="<<x1<<"\t x2="<<x2<<"\t x3="<<x3<<"\n";
}
else

{

if (-q/2+sqrt(D)>0)
u=pow((-q/2+sqrt(D)),(float)1/3);
else
if (-q/2+sqrt(D)<0)
u=-pow(fabs(-q/2+sqrt(D)),(float)1/3);
else u=0;
if (-q/2-sqrt(D)>0)
v=pow((-q/2-sqrt(D)),(float)1/3);
else
if (-q/2-sqrt(D)<0)
v=-pow(fabs(-q/2-sqrt(D)),(float)1/3);
else v=0;

x1=u+v-r/3;

h=-(u+v)/2-r/3;
g=(u-v)/2*sqrt((float)3);
cout<<"\n x1="<<x1;
cout<<"\t x2="<<h<<"+"<<g<<"i \t x3="<<h<<"-"<<g<<"i \n";
}
return 0;
}

вот рабочий код

#include <iostream>
# include <math.h>
using namespace std;

void main()
{
    double a,b,c,d,f,g,x,y,tret,discrim,x1,x2,x3,y1,y2,y3,yrav2;
    cout<<"Vvedite A ";
    cin>>a;
    cout<<"Vvedite B ";
    cin>>b;
    cout<<"Vvedite C ";
    cin>>c;
    cout<<"Vvedite D ";
    cin>>d;
    cout<<"Vvedite F ";
    cin>>f;
    cout<<"Vvedite G ";
    cin>>g;

    x1=g-d;
    y1=f*x1+g;
    yrav2=a*pow(x1,3)+b*pow(x1,2)+c*x1+d;
    tret=c-f;
    discrim=sqrt(pow(b,2)-4*a*tret);
    // cout<<"Deskriminant: "<<discrim<<'\n';

    cout<<"Krivaya i pryamaya peresekaet'sya v tochkah:"<<'\n';

    cout<<"Tochka peresecheniya: "<<"("<<x1<<";"<<y1<<")"<<'\n';
    if (discrim>0)
    {
        x2=(-b+discrim)/(2*a);
        x3=(-b-discrim)/(2*a);
        y2=f*x2+g;
        y3=f*x3+g;
        cout<<"Tochka peresecheniya : "<<"("<<x2<<";"<<y2<<")"<<'\n';
        cout<<"Tochka peresecheniya : "<<"("<<x3<<";"<<y3<<")"<<'\n';
    }
    else if(discrim=0)
    {
        x2=-b/(2*a);
        y2=f*x2+g;
        cout<<"Tochka peresecheniya: "<<"("<<x2<<";"<<y2<<")"<<'\n';
    }
    else 
    {
        cout<<" "<<'\n';
    }

}

Если мне не изменяет память, то для нахождения точек пересечения двух функции надо эти функции приравнять и решить полученное уравнение относительно x. Потом подставить полученные решения в одно из уравнений и решить его относительно y.

1) ax^3 + bx^2 + cx + d = fx + g
2) ax^3 + bx^2 + cx + d - fx - g = 0
   ax^3 + bx^2 + (c - f)x + (d - g) = 0
   решаем кубическое уравнение, получаем 1, 2 или 3 корня (x1, x2, x3)
3) подставляем полученные корни во второе уравнение (оно более простое):
   f * x1 + g -> y1
   f * x2 + g -> y2
   f * x3 + g -> y3
4) Координаты точек пересечения графиков (x1, y1), (x2, y2), (x3, y3).

Для твоих функций одна точка пересечения будет всегда. Наличие еще одной или двух точек пересечения зависит от коэффициентов при x.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.