2016-07-17 8 views
6

द्वारा फिनिटेट के रूप में लौटाए गए समाधान सेट से एक मान प्राप्त करें I Python Sympy लाइब्रेरी में एक स्क्रिप्ट बना रहा हूं और solveset() और linsolve() फ़ंक्शंस द्वारा दिए गए परिणाम तक पहुंचने का प्रयास कर रहा हूं। मेरी समस्या यह है कि इन कार्यों द्वारा लौटाई गई वस्तु टाइप फिनिटेट का है और मैं इसे अन्य समीकरणों में पुनः दर्ज करने के लिए कुछ परिणाम स्वचालित रूप से चुनना चाहता हूं। कोई भी शरीर मेरी मदद कर सकता है?सिम्पी

एक उदाहरण

:

>>>lista=[eq2_1,eq2_2] 
>>>str(lista) 
[-3*a1/10 - 3*a2/20 + 1/12, -3*a1/20 - 13*a2/105 + 1/20] 

फिर एक विधि linsolve() के साथ इसे हल: मैं दो अज्ञात चर के साथ समीकरणों की एक सूची बना।

>>>a=linsolve(lista,a1,a2) 
>>>a 
{(71/369, 7/41)} 

परिणाम सही है, लेकिन मैं एक चर करने के लिए ये परिणाम प्राप्त करने में असमर्थ हूँ।

ओ ने डीआईसीएस, सूचियों, टुपल्स, इंडेक्सिंग कमांड की कोशिश की, लेकिन हमेशा त्रुटि लौटा दी।

उत्तर

2

आप iter का उपयोग सेट के आधार पर एक इटरेटर प्राप्त करने के लिए कर सकते हैं, और फिर next कि सेट में से एक तत्व वापस जाने के लिए (यदि आप केवल एक तत्व की जरूरत है) "Finiteset वस्तुओं कोई विशेषता 'कमांड' है।"

उदाहरण:

from sympy import * 
var('x y') 
sol = linsolve([x+y-2, 2*x-3*y], x, y) 
(x0, y0) = next(iter(sol)) 

अब x0 6/5 और 4/5 Y0 है। इस मामले a[0] में -

2

एक से थोड़ा अधिक सामान्य समाधान बस एक मानक अजगर list

>>> a=list(linsolve(lista,a1,a2)) 
>>> a 
[(71/369, 7/41)] 

तो फिर तुम मानक अनुक्रमण का उपयोग करके तत्व निकाल सकते हैं में FiniteSet कन्वर्ट करने के लिए है। लेकिन फिर यदि आपको कई समाधान मिलते हैं, तो आप केवल वह चाहते हैं जिसे आप चाहते हैं।

4

मैं इस लिंक http://docs.sympy.org/latest/tutorial/manipulation.html

उपयोग .args समारोह या परिणाम वस्तु में गुण में sympy पुस्तकालय रास्ता मिल गया। अगर मैं एक समारोह है:

>>>func = Eq(u(x),−x+sin(x)) 
>>>func 
u(x) = -x + sin(x) 
>>>func.args[0] 
u(x) 
>>>func.args[1] 
-x+sin(x) 

ही एक परिणाम है कि एक परिमित सेट प्रकार है के लिए लागू होता है।

+0

यह सही जवाब है – shrewmouse

0

आप तर्क unpacking के साथ संयोजन में tuple उपयोग कर सकते हैं:

var('x y z') 
eqs = [ x + y + z - 1, x + y + 2*z - 3 ] 
sol = linsolve(eqs, x, y, z) 
(x0, y0, z0) = tuple(*sol) 

अब आप के साथ समाधान की जाँच कर सकते हैं:

eqs[0].subs([(x, x0), (y, y0), (z, z0)]) 
eqs[1].subs([(x, x0), (y, y0), (z, z0)]) 
संबंधित मुद्दे