Pergunta

Eu estou tentando escrever uma função em C ++ que resolve para X usando a equação quadrática. Isto é o que eu escrevi inicialmente, que parece funcionar enquanto não há números complexos para uma resposta:

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;

Se, por exemplo, eu uso a equação:. X ^ 2 - x - 6, recebo a solução 3, -2 corretamente

A minha pergunta é como eu ia explicar os números complexos .... por exemplo, dada a equação:

x ^ 2 + 2x + 5

Resolver à mão, gostaria de obter -1 + 2i, -1 -. 2i

Bem, acho que duas perguntas, eu posso escrever o anterior melhor e também torná-lo contabilizar o número complexo?

Obrigado por qualquer ajuda!

Foi útil?

Solução

Algo como isso iria funcionar:

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;
}

Dessa forma, você obter os resultados de uma forma semelhante para ambos os resultados reais e complexos (os resultados reais só tem o conjunto parte imaginária a 0). Ficaria ainda mais bonita com impulso!

edit: corrigido para a coisa delta e acrescentou um cheque de casos degenerados como a = 0. Sleepless noite ftl!

Outras dicas

Uma nota importante de tudo isso. As soluções apresentadas nessas respostas e na pergunta original não são robustos.

A solução bem conhecida (- b + - sqrt (b ^ 2 - 4ac)) / 2a é conhecido por ser não-robusto em computação quando CA é muito pequena compered a b ^ 2 , porque um é subtrair dois valores muito semelhantes. É preferível utilizar a solução de menor conhecido 2c /. (-B - + sqrt (b ^ 2 -4ac)) para o outro raiz

A solução robusta pode ser calculado como:

temp = -0.5 * (b + sign(b) * sqrt(b*b - 4*a*c);
x1 = temp / a;
x2 = c / temp;

O uso de sinal (b) assegura que não estamos subtraindo dois valores semelhantes.

Para o OP, modificar este para números complexos, como mostrado por outros cartazes.

Você mais ou menos tê-lo, basta verificar para ver se a parte que está dentro da raiz quadrada é negativo e, em seguida, manter o controle de que separadamente em suas reduções.

Você pode, basicamente, é só usar std::complex<float> vez de float de obter apoio para números complexos.

nicking a idéia de 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)));
  }
}

Eu tentei o programa sem utilizar header 'math.h' e lógica diferente também tentou ... mas o meu programa pode responder apenas as equações de segundo grau que possuem coeficiente de 'x praça' como um ..... e onde o coeficiente de 'x' pode ser expressa como uma adição de dois números que são factores de termo constante. por exemplo. x quadrado + 8x + 16; x quadrado + 7x + 12; etc aqui 8 = 4 + 4 & 16 = 4 * 4; aqui coeficiente de X pode ser expresso como uma adição de dois números que são factores de termo constante 16 ... Eu mesmo não está totalmente satisfeito com ele, mas tentou algo diferente, sem usar a fórmula para resolver a equação quadrática. código é;

        #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();
                 }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top