Роман Орлов
Ученик
(127)
2 дня назад
#include <stdio.h>
#include <math.h>
// Функция для вычисления значения кубического полинома
double cubic(double a, double b, double c, double d, double x) {
return a * pow(x, 3) + b * pow(x, 2) + c * x + d;
}
// Производная кубического полинома
double cubic_derivative(double a, double b, double c, double x) {
return 3 * a * pow(x, 2) + 2 * b * x + c;
}
// Метод Ньютона-Рафсона для нахождения корня
double newton_raphson(double a, double b, double c, double d, double x0, double epsilon) {
double x = x0;
double f_x, f_prime_x;
do {
f_x = cubic(a, b, c, d, x);
f_prime_x = cubic_derivative(a, b, c, x);
x = x - f_x / f_prime_x;
} while (fabs(f_x) > epsilon);
return x;
}
// Функция для нахождения всех корней кубического уравнения
void find_roots(double a, double b, double c, double d, double epsilon) {
double roots[3];
int num_roots = 0;
// Начальные приближения для корней
double x0 = -10.0;
double x1 = 0.0;
double x2 = 10.0;
// Найдем корни
roots[0] = newton_raphson(a, b, c, d, x0, epsilon);
roots[1] = newton_raphson(a, b, c, d, x1, epsilon);
roots[2] = newton_raphson(a, b, c, d, x2, epsilon);
// Проверка на уникальность корней
for (int i = 0; i < 3; i++) {
if (i == 0 || fabs(roots[i] - roots[i - 1]) > epsilon) {
printf("x = %.6f\n", roots[i]);
num_roots++;
}
}
if (num_roots == 0) {
printf("Кривые не пересекаются.\n");
} else {
printf("Кривые пересекаются в следующих точках:\n");
for (int i = 0; i < num_roots; i++) {
double y = cubic(a + l, b, c + w, d + v, roots[i]);
printf("Точка пересечения: (x = %.6f, y = %.6f)\n", roots[i], y);
}
}
}
int main() {
double p, o, n, m;
double l, w, v;
double epsilon = 1e-6;
// Ввод коэффициентов кривых
printf("Введите коэффициенты первой кривой (p, o, n, m): ");
scanf("%lf %lf %lf %lf", &p, &o, &n, &m);
printf("Введите коэффициенты второй кривой (l, w, v): ");
scanf("%lf %lf %lf", &l, &w, &v);
// Коэффициенты кубического уравнения
double a = p - l;
double b = o;
double c = n - w;
double d = m - v;
// Поиск корней
find_roots(a, b, c, d, epsilon);
return 0;
}
Как пример должно быть по похожими функциями языка си:
#include <stdio.h>
#include <math.h>
double sgn(double x)
{
return x<0?-1:1;
}
double cubpow(double x)
{
if (x>0) return pow(x, (double)1/3);
else if (x<0) return -pow(-x, (double)1/3);
else return 0;
}
int main(int argc, char **argv)
{
double r,s,t,Q,M,N,x1,x2,x3,fi;
printf(" x^3+rx^2+sx+t=0\n");
printf("r="); scanf("%lf",&r);
printf("s="); scanf("%lf",&s);
printf("t="); scanf("%lf",&t);
Q=(r*r-3*s)/9;
M=(2*r*r*r-9*r*s+27*t)/54;
N=Q*Q*Q-M*M;
// printf("Q=%10.3lf, M=%10.3lf, N=%10.3lf\n",Q,M,N);
if (N>0)
{
fi=acos(M/sqrt(Q*Q*Q))/3;
x1=-2*sqrt(Q)*cos(fi)-r/3;
x2=-2*sqrt(Q)*cos(fi+2*M_PI/3)-r/3;
x3=-2*sqrt(Q)*cos(fi-2*M_PI/3)-r/3;
printf("x1=%10.3lf, x2=%10.3lf, x3=%10.3lf\n",x1,x2,x3);
}
else if(N<0)
if (Q>0)
{
fi=acosh(fabs(M)/sqrt(Q*Q*Q))/3;
double H=sgn(M)*sqrt(Q)*cosh(fi);
x1=-2*H-r/3;
printf
("x1=%10.3lf,x2=%10.3lf %10.3lf*i,x3=%10.3lf %10.3lf*i\n",
x1,H-r/3,sqrt(3)*sinh(fi)*sqrt(Q),H-r/3,
-sqrt(3)*sinh(fi)*sqrt(Q));
}
else
if (Q<0)
{
fi=asinh(fabs(M)/sqrt(fabs(Q)*fabs(Q)*fabs(Q)))/3;
double H=sgn(M)*sqrt(fabs(Q))*sinh(fi);
x1=-2*H-r/3;
printf(
"x1=%10.3lf, x2=%10.3lf %10.3lf*i, x3=%10.3lf %10.3lf*i\n",
x1,H-r/3,sqrt(3)*cosh(fi)*sqrt(fabs(Q)),
H-r/3,-sqrt(3)*cosh(fi)*sqrt(fabs(Q)));
}
else
{
x1=-cubpow(t-r*r*r/27)-r/3;
printf(
"x1=%10.3lf, x2=%10.3lf %10.3lf*i, x3=%10.3lf %10.3lf*i\n",
x1,-0.5*(r+x1),sqrt(fabs(4*s*(r-3*x1)*(r+x1)))/2,
-0.5*(r+x1),-sqrt(fabs(4*s*(r-3*x1)*(r+x1)))/2);
}
else
{
x1=-2*cubpow(M)-r/3;
x2=cubpow(M)-r/3;
printf("x1=%10.3lf, x2=%10.3lf, x3=%10.3lf\n",x1,x2,x2);
}
return 0;
}