Решить квадратичное уравнение в C++
Я пытаюсь написать функцию на C++, которая решает для X, используя квадратичное уравнение. Это то, что я написал изначально, который, кажется, работает до тех пор, пока нет комплексных чисел для ответа:
float solution1 = (float)(-1.0 * b) + (sqrt((b * b) - (4 * a * c)));
solution1 = solution1 / (2*a);
cout << "Solution 1: " << solution1 << endl;
float solution2 = (float)(-b) - (sqrt((b*b) - (4 * a * c)));
solution2 = solution2 / (2*a);
cout << "Solution 2: " << solution2;
если, например, я использую уравнение: x^2 - x-6, я правильно получаю решение 3, -2.
мой вопрос в том, как я буду учитывать комплексные числа....например, дано уравнение:
x^2 + 2x + 5
решение вручную, Я бы получил -1 + 2i, -1-2i.
Ну, я думаю, два вопроса, Могу ли я написать выше лучше, а также сделать его учет комплексного числа?
Спасибо за любую помощь!
7 ответов
что-то вроде этого будет работать:
struct complex { double r,i; }
struct pair<T> { T p1, p2; }
pair<complex> GetResults(double a, double b, double c)
{
pair<complex> result={0};
if(a<0.000001) // ==0
{
if(b>0.000001) // !=0
result.p1.r=result.p2.r=-c/b;
else
if(c>0.00001) throw exception("no solutions");
return result;
}
double delta=b*b-4*a*c;
if(delta>=0)
{
result.p1.r=(-b-sqrt(delta))/2/a;
result.p2.r=(-b+sqrt(delta))/2/a;
}
else
{
result.p1.r=result.p2.r=-b/2/a;
result.p1.i=sqrt(-delta)/2/a;
result.p2.i=-sqrt(-delta)/2/a;
}
return result;
}
таким образом, вы получаете результаты аналогичным образом для реальных и сложных результатов (реальные результаты просто имеют мнимую часть, равную 0). Будет выглядеть еще красивее с boost!
edit: исправлено для дельта-вещи и добавлена проверка для вырожденных случаев, таких как a=0. Бессонная ночь ФТЛ!
важное замечание ко всему этому. Решения, показанные в этих ответах и в исходном вопросе, не являются надежными.
известное решение (- b + - sqrt (B^2-4ac)) / 2a считается не надежной в расчет, когда ac очень мало compered к b^2, потому что один вычитает два очень похожих значения. Лучше использовать менее известное решение 2c / (- b- + sqrt (B^2-4ac)) для других корень.
надежное решение может быть вычислена как:
temp = -0.5 * (b + sign(b) * sqrt(b*b - 4*a*c);
x1 = temp / a;
x2 = c / temp;
использование знака (b) гарантирует, что мы не вычитаем два одинаковых значения.
для OP измените это для комплексных чисел, как показано на других плакатах.
У вас более или менее есть, просто проверьте, является ли часть, находящаяся внутри квадратного корня, отрицательной, а затем следите за этим отдельно в своих сокращениях.
как sidenote: При делении всегда проверяйте, не равен ли знаменатель нулю. И помните, для чисел с плавающей запятой использовать что-то вроде:
#inlcude <float.h>
if (fabs(a) < FLT_EPSILON)
then a is considered 0
вы могли бы просто использовать std::complex<float>
вместо float
чтобы получить поддержку комплексных чисел.
вырывая идею из Blindy:
typedef std::complex<double> complex;
using std::pair;
pair<complex> GetResults(double a, double b, double c)
{
double delta=(b*b-4*a*c);
double inv_2a = 1/2/a;
if(delta >= 0) {
double root = sqrt(delta);
return std::make_pair(
complex((-b-root)*inv_2a),
complex((-b+root)*inv_2a);
} else {
double root = sqrt(-delta);
return std::make_pair(
complex(-b*inv_2a, -root*inv_2a)),
complex(-b*inv_2a, +root*inv_2a)));
}
}
я попробовал программу без использования ' math.H ' заголовок, а также попробовал другую логику...но моя программа может ответить только на те квадратичные уравнения, которые имеют коэффициент "X квадрат" как один ..... и где коэффициент " x " может быть выражен как сложение двух чисел, которые являются факторами постоянного члена. например. X квадрат +8x + 16; X квадрат +7x+12; так далее. здесь 8=4+4 & 16=4*4; здесь коэффициент x может быть выражен как сложение двух чисел, являющихся коэффициентами постоянного члена 16... Я я сам не полностью доволен, но попробовал что-то другое, не используя формулу для решения квадратного уравнения. код;
#include<iostream.h>
#include<conio.h>
class quadratic
{
int b,c ;
float l,k;
public:
void solution();
};
void quadratic::solution()
{
cout<<"Enter coefficient of x and the constant term of the quadratic eqn where coefficient of x square is one";
cin>>b>>c;
for(l=1;l<b;l++)
{
for(k=1;k<b;k++)
{
if(l+k==b&&l*k==c)
{
cout<<"x="<<-l<<"\t"<<"or"<<"\t"<<"x="<<-k;
cout<<"\n";
}
}
}
}
void main()
{
quadratic a;
clrscr();
a.solution();
getch();
}