Frage

Ich versuche, eine Funktion in C ++ zu schreiben, die für X unter Verwendung der quadratische Gleichung löst. Das ist, was ich ursprünglich geschrieben, die so lange zu arbeiten scheint, da es keine komplexen Zahlen für eine Antwort:

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;

Wenn zum Beispiel verwende ich die Gleichung:. X ^ 2 - x - 6, erhalte ich die Lösung 3, -2 richtig

Meine Frage ist, wie würde ich für komplexe Zahlen berücksichtigen .... zum Beispiel angesichts der Gleichung:

x ^ 2 + 2x + 5

Solving von Hand, ich würde erhalten -1 + 2i -1 -. 2i

Nun, ich denke, zwei Frage, kann ich die oben besser schreiben und diese auch Konto für die komplexe Zahl machen?

Vielen Dank für jede Hilfe!

War es hilfreich?

Lösung

So etwas wie dies funktionieren würde:

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

So können Sie die Ergebnisse in ähnlicher Weise erhalten sowohl für reelle und komplexe Ergebnisse (die realen Ergebnisse haben nur den imaginären Teil auf 0 gesetzt). Aussehen würde noch schöner mit Boost!

edit: für die Delta-Sache festgelegt und einen Scheck für degenerierte Fälle wie a = 0 gegeben. Sleepless Nacht FTL!

Andere Tipps

Ein wichtiger Hinweis auf all dies. Die Lösungen in diesen Antworten und in der ursprünglichen Frage gezeigt sind nicht robust.

Die bekannte Lösung (- b + - sqrt (b ^ 2 - 4ac)) / 2a ist bekannt, in der Berechnung nicht robust zu sein, wenn AC sehr ist kleine compered zu b ^ 2 , weil man zwei sehr ähnliche Werte subtrahiert wird. Es ist besser, die weniger bekannte Lösung zu verwenden 2c /. (-B - + sqrt (b ^ 2 -4ac)) für die andere Wurzel

Eine robuste Lösung kann wie folgt berechnet werden:

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

Die Verwendung von Zeichen (b) stellt sicher, dass wir nicht subtrahieren zwei ähnliche Werte.

Für die OP, modifizieren diese für komplexe Zahlen, wie andere Plakate gezeigt.

Sie mehr oder weniger es haben, überprüfen Sie nur zu sehen, wenn der Teil, der innerhalb der Quadratwurzel ist negativ und dann in Ihren Reduzierungen Spur dieser separat zu halten.

Sie können im Grunde verwenden nur std::complex<float> statt float Unterstützung für komplexe Zahlen zu erhalten.

Nicking die Idee von 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)));
  }
}

habe ich versucht, das Programm ohne ‚math.h‘ Headers und auch versucht, andere Logik ... aber mein Programm kann nur die quadratischen Gleichungen beantworten, die Koeffizienten von ‚x Quadrat‘ als einen ..... und wo Koeffizient von ‚x‘ kann als Addition zweier Zahlen ausgedrückt werden, die Faktoren der konstanten Größe sind. z.B. x square + 8x + 16;     x square + 7x + 12; usw. hier 8 = 4 + 4 & 16 = 4 * 4; hier Koeffizient von x kann als Addition zweier Zahlen ausgedrückt werden, die 16 Faktoren der konstanten Größe sind ... Ich selbst ist nicht ganz zufrieden mit ihm, aber versuchte, etwas anderes, ohne dass die Formel für quadratische Gleichung zu lösen. Code ist;

        #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();
                 }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top