2016-03-29 4 views
6

मेरे पास एक स्क्रिप है जो स्वचालित रूप से समीकरण उत्पन्न करती है।जांचें कि एक समीकरण चर के विशिष्ट सेट के लिए रैखिक है

समीकरण प्रतीकों का उपयोग करके समीकरण बनाए जाते हैं।

मैं जानना चाहता हूं कि यह जांचने का एक तरीका है कि समीकरण कुछ चर के संदर्भ में रैखिक हैं या नहीं।

उदाहरण के लिए।

a, b, c, d = sympy.symbols('a, b, c, d') 

eq1 = c*b*a + b*a + a + c*d 

निम्नलिखित के लिए चेक: a, d के मामले में रैखिक है?

True 
+0

अभिव्यक्ति कितनी जटिल हो सकती है? –

उत्तर

3

एक समारोह (संयुक्त रूप से) चर का एक दिए गए समुच्चय में रैखिक अगर सब दूसरे क्रम डेरिवेटिव शून्य (मिश्रित सहित) तथा इससे हो रहा है।

def is_linear(expr, vars): 
    for x in vars: 
     for y in vars: 
      try: 
       if not sympy.Eq(sympy.diff(expr, x, y), 0): 
        return False 
      except TypeError: 
       return False 
    return True 

पाश में, हर व्युत्पन्न ले जाया गया और शून्य करने के लिए समानता के लिए चेक किया गया है: यह इस प्रकार की जाँच की जा सकती है। यदि सिम्पी यह तय नहीं कर सकता है कि यह शून्य है (TypeError उठा रहा है) तो यह समान रूप से शून्य नहीं है।

आउटपुट:

>>> is_linear(eq1, [a,d]) 
True 
>>> is_linear(eq1, [a,c]) 
False 

अलग linearity के लिए जाँच करने के लिए (जैसे, एक में अलग से और अलग से ख में), ड्रॉप मिश्रित आंशिक डेरिवेटिव:

def is_separately_linear(expr, vars): 
    for x in vars: 
     try: 
      if not sympy.Eq(sympy.diff(expr, x, x), 0): 
       return False 
     except TypeError: 
      return False 
    return True 

आउटपुट:

>>> is_separately_linear(eq1, [a,d]) 
True 
>>> is_separately_linear(eq1, [a,c]) 
True 
2

उत्तर एफ पर विस्तार करने के लिए रोम 404, अगर एफ xy = 0, तो एफ yx = 0। इस प्रकार, मिश्रित डेरिवेटिव समाधान के लिए गणना समय आधा में कटौती की जा सकती है।

from itertools import combinations_with_replacement 

def is_linear(expr, variables): 
    combs = combinations_with_replacement(variables, 2) 
    try: 
     return all(sympy.Eq(sympy.diff(expr, *t), 0) for t in combs) 
    except TypeError: 
     return False 
3

अभिव्यक्ति की डिग्री प्रत्येक चर में बहुपद के रूप में जांचने का एक आसान तरीका होगा।

In [17]: eq1 = c*b*a + b*a + a + c*d 

In [18]: degree(eq1, a) 
Out[18]: 1 

In [19]: degree(eq1, d) 
Out[19]: 1 

और अभिव्यक्ति यदि बहुपद डिग्री < = 1.

है आप जानते हैं कि अभिव्यक्ति अपने चर में एक बहुपद है, तो आप भी सिर्फ अधिकार है कि चर शामिल के लिए जाँच कर सकते हैं रैखिक है।

In [21]: [i for i in eq1.atoms(Pow) if i.base == a] 
Out[21]: [] 

In [22]: eq2 = b*a**2 + d + c 

In [23]: [i for i in eq2.atoms(Pow) if i.base == a] 
Out[23]: 
⎡ 2⎤ 
⎣a ⎦ 
संबंधित मुद्दे