Sympy: كيفية إرجاع تعبير من حيث التعبير الآخر (التعبير)؟

StackOverflow https://stackoverflow.com/questions/2038100

  •  19-09-2019
  •  | 
  •  

سؤال

أنا جديد إلى حد ما سيمبي ولدي ما قد يكون سؤال أساسي. أو قد أكون ببساطة تفسير تفسير كيفية استخدام Sympy.

هل هناك طريقة لإنشاء تعبير لا يمثله الذرات، ولكن عن طريق مزيج من التعبيرات الأخرى؟

مثال:

>>> from sympy.physics.units import *
>>> expr1 = m/s
>>> expr2 = mile/hour
>>> expr1
m/s
>>> expr2
1397*m/(3125*s)
>>> expr1.in_terms_of([mile,hour]) #in my dreams?
3125*mile/(1397*hour)
>>> 

في ملاحظة جانبية: هل يمكنني العثور على إصدار "PDF" رسميا "رسميا (أو غيرها من الوثائق) من وثائق Sympy كاملة؟ (أنا تحت قيود استخدام الإنترنت المكرونة في العمل وأنا تعبت من القيام بالعمل في المنزل في عطلة نهاية الأسبوع).

تحديث:

هذا هو ما انتهى بي الأمر باتباع اقتراح مقدمة، لكن من غير المرجح أن تحصل على الكثير من الاستخدام مثل هذا لأنه يشعر القذرة. تعليقات و WTF موضع ترحيب.

def in_terms_of(self, terms):
    expr2 = eval(str(self), physics.units.__dict__)
    converter = {}
    for term in terms:
        term_expr = physics.units.__dict__[term]
        coeff = term_expr.as_coeff_terms()[0]
        unit = physics.units.Unit('my_'+term, term)
        converter[term_expr/coeff] = unit/coeff
    return str(expr2.subs(converter))

الاستعمال:

>>> x = in_terms_of('J',['gram','mile','hour'])
>>> x
'9765625000*mile**2*gram/(1951609*hour**2)'
>>> in_terms_of(x,['J'])
'J'
هل كانت مفيدة؟

المحلول

التحقق من المصدر ل sympy.physics.units. يمكنك أن ترى أن جميع الوحدات محددة من حيث الأمتار والكيلوغرامات والثواني والبهارات والكيلفينز والشاتيلات والشمدة. هذه هي الوحدات الأساسية.

ثم يتم تعريف ميل على أنه 5280 قدم، ويتم تعريف القدم على أنها 0.3048 متر.

لذلك ستحصل جميع التعبيرات باستخدام الوحدات غير الأساسية على الوحدات غير الأساسية محل الوحدات الأساسية.

يمكنك تحديد وحداتك الخاصة التي يمكنك التعبير عن تعبير عندما تحتاج إلى تعبير لاستخدام وحدات معينة:

import sympy.physics.units as units
from sympy import Rational

my_mile = units.Unit('my_mile', 'mile')
my_hour = units.Unit('my_hour', 'hour')

ثم حدد القاموس الذي سيحل محل الوحدات الأساسية لوحداتك الجديدة.

converter = {units.m: my_mile/Rational('1609.344'),
             units.s: my_hour/Rational('3600')}

قم بتنفيذ جميع الحسابات الخاصة بك باستخدام الوحدات الأساسية. ثم إذا كنت تريد قيمة باستخدام الأميال والساعات، فيمكنك استبدال وحداتك الجديدة في التعبير.

v = 10*units.miles/units.hour
print v # = 2794*m/(625*s)

print v.subs(converter) # = 10*mile/hour

استخدم إجابة ARS للحصول على المستندات. مستودع Sympy هنا: https://github.com/sympy/sympy.

يوجد ملف Readme في مجلد DOCS الذي يصف كيفية إنشاء مستندات HTML.

نصائح أخرى

هناك ايضا كميات:

In [1]: from quantities import *
In [2]: v = 1397*m / (3125*s)
In [3]: v
Out[3]: array(0.44704) * m/s
In [8]: v.units = mile/hour
In [9]: v
Out[9]: array(1.0) * mi/h

في وحدات Sympy التي تحولها من EXPR1 إلى EXPR2 بتقسيم:

In [120]: import sympy.physics.units as units

In [121]: expr1 = units.m / units.s

In [122]: expr2 = units.miles / units.hour

In [123]: a = (1397/3125) * expr1 / expr2

In [124]: a
Out[124]: 1

المشكلة الوحيدة هي أنه في نهاية المطاف بكمية بدون أبعاد. قد تفكر أيضا كميات حزمة لهذا النوع من الشيء:

In [125]: import quantities as pq

In [126]: a = pq.Quantity(1397/3125, 'm/s')

In [127]: a
Out[127]: array(0.44703999999999999) * m/s

In [128]: a.units = pq.mile / pq.hour

In [129]: a
Out[129]: array(1.0) * mi/h

هناك ايضا منصب.

لا أعرف إصدار PDF من مستندات Sympy، لكن قد تتمكن من التحقق من التوزيع من مستودعه واستخدامه أبو الهول لتوليد PDF لنفسك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top