sympy

2013-03-04 7 views
6

में काल्पनिक जड़ों पर ध्यान न दें मैं एक बहुपद हल करने के लिए sympy उपयोग कर रहा हूँ:sympy

x = Symbol('x') 
y = solve(int(row["scaleA"])*x**3 + int(row["scaleB"])*x**2 + int(row["scaleC"])*x + int(row["scaleD"]), x) 

y संभव समाधान की एक सूची है। हालांकि, मुझे काल्पनिक लोगों को अनदेखा करने और केवल वास्तविक समाधानों का उपयोग करने की आवश्यकता है। साथ ही, मैं समाधान को एक मान के रूप में एक अभिव्यक्ति के रूप में नहीं चाहता हूं। अभी यह ऐसा लगता है:

[-2/3 - 55**(1/3)*(-1/2 - sqrt(3)*I/2)/3, -2/3 - 55**(1/3)*(-1/2 + sqrt(3)*I/2)/3, -55**(1/3)/3 - 2/3] 

मुझे अंतिम अभिव्यक्ति के मूल्य (-2.22756) की आवश्यकता है। क्या इसे सरल बनाने के लिए सिम्पी में कार्य हैं?

+4

सिमपी शायद उपयोग करने के लिए सही लाइब्रेरी नहीं है यदि आप रूट की केवल फ्लोट/डबल सन्निकटन में रूचि रखते हैं। यदि आप numpy/scipy का उपयोग करते हैं तो आपको शायद बेहतर प्रदर्शन और सरल कोड मिल जाएगा। और यदि आप numpy/scipy पर sympy चुनते हैं क्योंकि यह छोटा है, तो आप mpmath के साथ भी छोटे हो सकते हैं जिसका उपयोग संख्यात्मक के लिए सिम्पी के अंदर किया जाता है (मशीन द्वारा सीमित मनमाने ढंग से सटीक नहीं) – Krastanov

उत्तर

0

रूप Krastonov कहा था mpmath एक आसान विधि प्रदान की:

y = polyroots([int(row["scaleA"]), int(row["scaleB"]), int(row["scaleC"]), int(row["scaleD"])-value]) 
for root in y: 
    if "j" not in str(root): 
     value = root 
-3

मैं अभिव्यक्ति का मूल्यांकन करने के लिए चरित्र "I" युक्त समाधानों को अनदेखा करने में कामयाब रहा और .evalf() का उपयोग किया। कोड है:

x = Symbol('x') 
    y = solve(int(row["scaleA"])*x**3 + int(row["scaleB"])*x**2 + int(row["scaleC"])*x + int(row["scaleD"]), x) 
    for root in y: 
     if "I" not in str(root): 
      print("This One:" + str(root.evalf())) 
+3

वास्तविक जड़ों को फ़िल्टर करने का एक बेहतर तरीका है ' root.is_real'। – asmeurer

9

आप x सेट करते हैं असली होने के लिए, SymPy केवल आप वास्तविक समाधान दे देंगे

x = Symbol('x', real=True) 
solve(..., x) 
+0

मैं इस विधि का उपयोग कर समीकरण को हल करने की कोशिश कर रहा हूं लेकिन यह अभी भी काल्पनिक समाधान – Alex

+0

देता है क्या आप हल का उपयोग कर रहे हैं? ध्यान दें कि नया 'सॉल्वसेट' वास्तविक डोमेन में हल करने के लिए प्रतीकों पर सेट धारणाओं को अनदेखा करता है (वास्तविक समाधान में हल करने के लिए 'solveset (domain = S.Reals)' का उपयोग करें। यदि आप हल का उपयोग कर रहे हैं, तो यह एक बग है जिसे [रिपोर्ट किया जाना चाहिए] (https: //github.com/sympy/sympy/issues/new) – asmeurer

+0

मैंने दोनों की कोशिश की: डोमेन = S.Reals के साथ धारणाओं, सॉल्वसेट और सॉल्वसेट के साथ हल करें। हलवे आसानी से हल करने के लिए चर पर धारणाओं को छोड़ रहा था (सॉल्वसेट के रूप में) 30 सेकंड में समाधान के लिए आ रहा है, जबकि एक डोमेन के साथ सॉल्वैसेट 20 मिनट में समाधान तक पहुंचने में सक्षम नहीं था। क्या यह एक डुप्लिकेट हो सकता है? (https://github.com/sympy/sympy/issues/9973) – Alex

0

solve() में विभिन्न प्रकार के समाधानों के लिए लगातार उत्पादन नहीं है, कृपया solveset(Eq,x,domain=S.Reals):

का उपयोग करें
from sympy import ImageSet, S 
x = Symbol('x') 
y = solveset(int(row["scaleA"])*x**3 + int(row["scaleB"])*x**2+int(row["scaleC"])*x + int(row["scaleD"]), x, domain=S.Reals) 

http://docs.sympy.org/latest/modules/solvers/solveset.html

1

यह ठीक बात की तरह है कि real_roots के लिए बना दिया है और अपने मामले जहां गुणांक पूर्णांक हैं करने के लिए विशेष रूप से लागू होता है है:

x = Symbol('x') 
eq = int(row["scaleA"])*x**3 + int(row["scaleB"])*x**2 + int(row["scaleC"])*x + int(row["scaleD"]) 
y = real_roots(eq, x) # gives [CRootOf(...), ...] 

CRootOf उदाहरणों में से मान हो सकता है आपको जो भी सटीकता चाहिए, उसका मूल्यांकन किया गया है और इसमें कोई काल्पनिक हिस्सा नहीं होना चाहिए। उदाहरण के लिए,

>>> [i.n(12) for i in real_roots(3*x**3 - 2*x**2 + 7*x - 9, x)] 
[1.07951904858] 

नोट: मुझे याद है के रूप में, वापस जड़ों कि यह मान्यताओं से मुलाकात की पुष्टि करने के लिए (में सक्षम नहीं था भेज देंगे हल यानी अगर वे इस धारणा है तो वे वापस आ रहे हैं के लिए गलत नहीं पाए गए)। इसके अलावा, अगर आप हल से अधिक सुसंगत आउटपुट चाहते हैं, तो @PyRick, ध्वज dict=True सेट करें।

संबंधित मुद्दे