2009-05-22 13 views
6

में क्वाड्रैटिक समीकरण हल करें मैं सी ++ में एक फ़ंक्शन लिखने की कोशिश कर रहा हूं जो वर्ग के समीकरण का उपयोग कर एक्स के लिए हल करता है। यह वही है मैं शुरू में लिखा है, जो जब तक एक जवाब के लिए कोई जटिल नंबर दिए गए हैं काम करने के लिए लगता है:सी ++

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।

ठीक है, मुझे लगता है कि दो प्रश्न हैं, क्या मैं ऊपर से बेहतर लिख सकता हूं और इसे जटिल संख्या के लिए भी खाता बना सकता हूं?

किसी भी मदद के लिए धन्यवाद!

+3

अन्य लोग अच्छा जवाब प्रदान की तो कोशिश मेरे लिए कोई कारण नहीं करने के लिए और उन्हें ग्रहण करना;) हालांकि, अगर आप समीकरण कुल्हाड़ी के लिए एक अधिक सामान्य समाधान चाहते हैं^2 + bx + c = 0, एक है कि याद = = 0 मान्य मान होना चाहिए। इसके परिणामस्वरूप शून्य का विभाजन होगा, इसलिए आपको इस मामले का अलग-अलग ख्याल रखना चाहिए। इस मामले में इसका मतलब यह होगा कि आपको एक रूट के साथ एक रैखिक समीकरण के साथ छोड़ दिया गया है। चीयर्स! – ralphtheninja

+0

आपको लगता है कि आप जटिल जड़ों के बारे में चिंतित हैं, लेकिन मूल समीकरण में जटिल गुणांक के बारे में क्या? –

+1

जटिल गुणांकों को पूरी तरह से एक और दृष्टिकोण की आवश्यकता है। तो यह अगला प्रश्न होगा :) * scurrs बंद और हाथ से पहले एक उत्तर तैयार करता है * – ralphtheninja

उत्तर

8

कुछ इस तरह काम करेंगे:

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 के लिए काल्पनिक भाग सेट है)। बढ़ावा के साथ भी सुंदर दिखेंगे!

संपादित करें: डेल्टा चीज़ के लिए तय किया गया है और एक = 0 जैसे अपमानजनक मामलों के लिए एक चेक जोड़ा गया है। नींद की रात ftl!

+0

यदि वर्ग सफल होता है, तो परिणाम> = 0. है और यदि तर्क नकारात्मक है, तो आपका प्रोग्राम क्रैश हो जाता है। आपको पहले संकेत का परीक्षण करना चाहिए, और बाद में sqrt की गणना करना चाहिए। यदि संकेत नकारात्मक होगा, तो आप परिणाम सेट करेंगे। First.i = + sqrt (4 * a * c-b * b)/2/a। (यदि कोई पूरी तरह से ठीक std :: pair ?) – MSalters

+0

डेल्टा = बी * बी -4 * ए * सी होना चाहिए, और डेल्टा> = 0 पर केवल sqrt लेना चाहिए, तो अपने स्वयं के प्रकार को परिभाषित क्यों करें। डेल्टा = 0 या ए = 0 वैध मामले हैं जब हमारे पास एक रूट है। क्या होगा यदि एक = बी = 0 और सी = 1? –

+0

क्या होगा अगर? यह एक वर्गबद्ध कार्य नहीं है, और/2/एक हिस्सा असफल हो जाएगा। यह डेल्टा = 0 पर उचित रूप से अच्छी तरह से काम करता है, सिवाय इसके कि दो बार एक ही परिणाम वापस आ जाएगा। – MSalters

4

आप इसे कम या ज्यादा रखते हैं, बस यह देखने के लिए जांचें कि वर्ग रूट के अंदर का हिस्सा नकारात्मक है और फिर अपनी कटौती में अलग से ट्रैक रखें।

3

एक sidenote के रूप में: विभाजित करते समय, हमेशा जांचें कि denominator शून्य नहीं है या नहीं। आप मूल रूप से सिर्फ std::complex<float> बजाय float का उपयोग जटिल संख्या के लिए समर्थन प्राप्त करने के सकता है

#inlcude <float.h> 
if (fabs(a) < FLT_EPSILON) 
    then a is considered 0 
3

: और चल बिन्दु संख्या की तरह कुछ का उपयोग करने के लिए याद है।

1

Blindy से विचार Nicking:

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

एक महत्वपूर्ण नोट इस सब के लिए। इन प्रतिक्रियाओं में और मूल प्रश्न में दिखाए गए समाधान मजबूत नहीं हैं।

अच्छी तरह से ज्ञात समाधान (-b + - sqrt (ख^2 - 4ac))/2 ए गणना में गैर मजबूत होने के लिए जब एसी बहुत छोटा 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; 

हस्ताक्षर के उपयोग (ख) सुनिश्चित करता है कि हम इसी तरह के दो मूल्यों घटाकर नहीं कर रहे हैं।

ओपी के लिए, अन्य पोस्टर्स द्वारा दिखाए गए जटिल संख्याओं के लिए इसे संशोधित करें।

+1

+1 यह महत्वपूर्ण रूप से कम्प्यूटेशनल रूप से अधिक मजबूत है (-b +/- sqrt (बी * बी - 4 * ए * सी))/(2 ए) '। बीटीडब्लू: चूंकि 'temp' 0.0 हो सकता है, आमतौर पर प्री-डिवीजन चेक की आवश्यकता होती है। (ई जी जी ए, बी, सी = 1,0,0)। – chux

+0

'temp' केवल 0 हो सकता है यदि' बी' 0 है –

-1

मैंने 'math.h' हेडर का उपयोग किए बिना प्रोग्राम की कोशिश की और विभिन्न तर्कों का भी प्रयास किया ... लेकिन मेरा प्रोग्राम केवल उन वर्गिक समीकरणों का उत्तर दे सकता है जिनमें 'x वर्ग' का गुणांक एक ..... और कहां है 'एक्स' के गुणांक को दो संख्याओं के अतिरिक्त के रूप में व्यक्त किया जा सकता है जो निरंतर अवधि के कारक हैं। उदाहरण के लिए। एक्स वर्ग + 8x + 16; एक्स वर्ग + 7x + 12; इत्यादि यहां 8 = 4 + 4 & 16 = 4 * 4; यहां एक्स के गुणांक को दो संख्याओं के अतिरिक्त के रूप में व्यक्त किया जा सकता है जो स्थिर अवधि 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(); 
       }