Решатель уравнений четвертой степени с конкретными случаями ошибокC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Решатель уравнений четвертой степени с конкретными случаями ошибок

Сообщение Anonymous »

Я нашел алгоритм решения уравнений четвертой степени на языке C, положительные действительные решения, но результат в некоторых конкретных сценариях не является ожидаемым.
Это алгоритм:< /p>

Код: Выделить всё

#include 
#include 
#include 
/*--------------------------------------------

--------------------------------------------*/
double cubic(double b,double c,double d)
{
double p=c-b*b/3.0;
double q=2.0*b*b*b/27.0-b*c/3.0+d;

if(p==0.0) return pow(q,1.0/3.0);
if(q==0.0) return 0.0;

double t=sqrt(fabs(p)/3.0);
double g=1.5*q/(p*t);
if(p>0.0)
return -2.0*t*sinh(asinh(g)/3.0)-b/3.0;

if(4.0*p*p*p+27.0*q*q0.0)
return -2.0*t*cosh(acosh(-g)/3.0)-b/3.0;

return 2.0*t*cosh(acosh(g)/3.0)-b/3.0;
}
/*--------------------------------------------

--------------------------------------------*/
int quartic(double b,double c,double d,double e,double* ans)
{

double p=c-0.375*b*b;
double q=0.125*b*b*b-0.5*b*c+d;
double m=cubic(p,0.25*p*p+0.01171875*b*b*b*b-e+0.25*b*d-0.0625*b*b*c,-0.125*q*q);
if(q==0.0)
{
if(m0.0)
{
double delta=sqrt(2.0*(-m-p));
ans[nroots++]=-0.25*b+0.5*(sqrt_2m-delta);
ans[nroots++]=-0.25*b-0.5*(sqrt_2m-delta);
ans[nroots++]=-0.25*b+0.5*(sqrt_2m+delta);
ans[nroots++]=-0.25*b-0.5*(sqrt_2m+delta);
}

if(-m-p==0.0)
{
ans[nroots++]=-0.25*b-0.5*sqrt_2m;
ans[nroots++]=-0.25*b+0.5*sqrt_2m;
}

return nroots;
}

if(m=0.0)
{
double delta=sqrt(2.0*(-m-p+q/sqrt_2m));
ans[nroots++]=0.5*(-sqrt_2m+delta)-0.25*b;
ans[nroots++]=0.5*(-sqrt_2m-delta)-0.25*b;
}

if(-m-p-q/sqrt_2m>=0.0)
{
double delta=sqrt(2.0*(-m-p-q/sqrt_2m));
ans[nroots++]=0.5*(sqrt_2m+delta)-0.25*b;
ans[nroots++]=0.5*(sqrt_2m-delta)-0.25*b;
}

return nroots;
}
/*--------------------------------------------

--------------------------------------------*/
int main(int nargs,char* args[])
{
if(nargs!=6)
{
printf("5 arguments are needed\n");
return EXIT_FAILURE;
}
double a=atof(args[1]);
double b=atof(args[2]);
double c=atof(args[3]);
double d=atof(args[4]);
double e=atof(args[5]);
if(a==0.0)
{
printf("1st argument should be nonzero\n");
return EXIT_FAILURE;
}

int nroots;
double ans[4];
nroots=quartic(b/a,c/a,d/a,e/a,ans);
if(nroots==0)
printf("Equation has no real roots!\n");
else
{
printf("Equation has %d real roots: ",nroots);
for(int i=0;i
d: -23457.482730
e: 5002.071465
Извините за некрасивые значения, они были обнаружены при тестировании игра, которую я разрабатываю.
Я не думаю, что проблема связана с округлением, потому что решение не так уж близко к 0. Результаты, когда функция работает правильно, действительно близко к реальным решениям.
Заранее спасибо за помощь :) 

Подробнее здесь: [url]https://stackoverflow.com/questions/78564625/quartic-equation-solver-with-specific-error-cases[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»