2016-04-12 8 views
11

में जटिल संख्याओं की स्क्वायर रूट मैंने पाइथन में जटिल संख्याओं की वर्ग जड़ों के साथ कुछ भ्रमित व्यवहार में भाग लिया है। इस कोड चल रहा है:पायथन

from cmath import sqrt 
a = 0.2 
b = 0.2 + 0j 
print(sqrt(a/(a - 1))) 
print(sqrt(b/(b - 1))) 

देता उत्पादन

0.5j 
-0.5j 

ऐसा ही एक बात

print(sqrt(-1 * b)) 
print(sqrt(-b)) 

यह बयान के इन जोड़ों प्रकट होता है एक ही जवाब देना चाहिए साथ क्या होता है? क्योंकि वे complex conjugates हैं

+0

[Wolfram] (https://www.wolframalpha.com/) के अनुसार आप सही हैं। पहली जोड़ी ([लिंक] (https://www.wolframalpha.com/input/?i=sqrt (0.2 +% 2 एफ + (0.2 + - + 1))) और [लिंक] (https: //www.wolframalpha .com/input /? i = sqrt (+ (0.2% 2B0i) +% 2F + (+ (0.2% 2B0i) + - 1+)))) दोनों '0.5i' होना चाहिए, और दूसरी जोड़ी ([लिंक] (https://www.wolframalpha.com/input/?i=sqrt(-1+*+(0.2+%2B+0i))) और [लिंक] (https://www.wolframalpha.com/input/ ? i = sqrt (-1 + * + (0.2 +% 2 बी + 0i)))) दोनों को '0.447214 ... i' होना चाहिए। 'Cmath.sqrt()' का स्रोत [यहां] है (https://hg.python.org/cpython/file/tip/Modules/cmathmodule.c#l732) ... – Jens

+6

दोनों उत्तर सही हैं, प्रश्न यही कारण है कि यह अलग conjugates देता है। – tzaman

+0

FWIW व्यवहार 2.7 और 3.5 में समान दिखाई देता है। – tzaman

उत्तर

8

दोनों जवाब (+0.5j और -0.5j), सही कर रहे हैं - जो कि वास्तविक हिस्सा समान है, और काल्पनिक हिस्सा साइन-फ़्लिप है।

code को देखते हुए व्यवहार स्पष्ट करता है - परिणाम के काल्पनिक हिस्सा हमेशा के रूप में 793 लाइनों 790 में देखा और, इनपुट के काल्पनिक भाग के रूप में एक ही हस्ताक्षर है:

r.imag = copysign(d, z.imag); 

के बाद से a/(a-1)0.25 है जो स्पष्ट रूप से 0.25+0j है आपको सकारात्मक परिणाम मिलता है; b/(b-1)0.25-0j उत्पन्न करता है (किसी कारण से; यह सुनिश्चित नहीं है कि इसका परिणाम 0.25+0j tbh क्यों नहीं है) इसलिए आपका परिणाम समान नकारात्मक है।

संपादित करें: This question में एक ही समस्या पर कुछ उपयोगी चर्चा है।

+0

'ए/(ए -1)' '-0.25' है। इसे जटिल में परिवर्तित करने से आपको '-0.25 + 0j' मिल जाता है। बी के साथ, आपको '-0.25-0j' मिलता है। – Seth

+0

[प्रलेखन] (https://docs.python.org/2/library/cmath.html#cmath।sqrt) यह भी निर्दिष्ट करता है कि शाखा कट को 0 से -∞ तक किरण के साथ चुना जाता है, जो मनाया व्यवहार प्रदान करेगा। यह दिलचस्प है कि 'बी/(बी -1)' काल्पनिक घटक के लिए नकारात्मक शून्य देता है, हालांकि। – user2357112

+0

@ user2357112 हाँ, यह बहुत अजीब है, मुझे यकीन नहीं है कि यह ऐसा क्यों करता है। आईडीएलई में एक शाब्दिक के रूप में बस '1-0j' टाइप करके मूल्य के रूप में '1 + 0j' उत्पन्न करता है। दिलचस्प बात यह है कि, '-0j' स्वयं ही' -0-0j' उत्पन्न करता है। – tzaman

1

मैं जवाब दे सकता हूं कि यह क्यों हो रहा है, लेकिन व्यवहार क्यों चुना गया था।

a/(a - 1) 

, 0.2/-0.8 जो -0.25 है, जो cmath.sqrt द्वारा एक जटिल संख्या में बदल जाती है पर मूल्यांकन करता है, जबकि

b/(b - 1) 

(0,2 + 0j)/करने के लिए मूल्यांकन करता है (- 0.8 + 0j) जो (-0.25-0j) है, जिसे एक जटिल जटिल घटक के साथ एक जटिल संख्या में परिवर्तित किया जाता है।

एक सरल उदाहरण के लिए,

cmath.sqrt(0j) == 0j 
cmath.sqrt(-0j) == -0j