سؤال

أحاول كتابة وظيفة في 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.

حسنا، أعتقد أن سؤالين، هل يمكنني كتابة ما ورد أعلاه وأيضا جعله يمثل الرقم المجمع؟

شكرا على اي مساعدة!

هل كانت مفيدة؟

المحلول

شيء مثل هذا سيعمل:

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). سوف تبدو أجمل مع دفعة!

تحرير: تم إصلاح شيء دلتا وإضافة شيك للحالات المتسابق مثل A = 0. ليلة بلا نوم ftl!

نصائح أخرى

ملاحظة مهمة لجميع هذا. الحلول الموضحة في هذه الاستجابات وفي السؤال الأصلي ليست قوية.

الحل المعروف (-B + - SQRT (B ^ 2 - 4AC)) / 2A من المعروف أن غير قوي في الحساب عندما إكسب هو صغير جدا مثل ب ^ 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) أننا لا نطرح قيمتين مماثلة.

بالنسبة إلى المرجع نفسه، قم بتعديل هذا للأرقام المعقدة كما هو موضح من قبل ملصقات أخرى.

أنت أكثر أو أقل، فقط تحقق لمعرفة ما إذا كان الجزء الموجود داخل الجذر التربيعي هو سلبي ثم تتبع ذلك بشكل منفصل في تخفيضاتك.

يمكنك أساسا فقط استخدام std::complex<float> بدلا من float للحصول على دعم للأرقام المعقدة.

تشريح الفكرة من الأعمدة:

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

جربت البرنامج دون استخدام رأس "الرياضيات"، وأجرب أيضا منطق مختلف ... ولكن يمكن لبرنامجي الإجابة فقط على تلك المعادلات التربيعية التي لديها معامل "X مربع" كواحد ..... وأين معامل 'س "يمكن التعبير عنها كإضافة إلى رقمين تعد عوامل مدة ثابتة. على سبيل المثال X Square + 8x + 16؛ X Square + 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();
                 }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top