سؤال

SymPy هي أداة رائعة لإجراء تحويلات الوحدات في بايثون:

>>> from sympy.physics import units
>>> 12. * units.inch / units.m
0.304800000000000

يمكنك بسهولة لف بنفسك:

>>> units.BTU = 1055.05585 * units.J
>>> units.BTU
1055.05585*m**2*kg/s**2

ومع ذلك، لا يمكنني تنفيذ ذلك في طلبي إلا إذا تمكنت من تحويل الدرجات C (المطلقة) إلى K إلى الدرجات F إلى الدرجات R، أو أي مجموعة منها.

اعتقدت أنه ربما يعمل شيء مثل هذا:

units.degC = <<somefunc of units.K>>

لكن من الواضح أن هذا هو الطريق الخطأ.هل هناك أي اقتراحات لتنفيذ تحويلات الوحدات من نوع "الإزاحة" بشكل نظيف في SymPy؟

ملحوظة:أنا منفتح على تجربة وحدات تحويل الوحدات الأخرى، ولكن لا أعرف أي شيء آخر إلى جانب ذلك واحد, ، ووجدت أنه مرهق.

يحرر:حسنًا، أصبح من الواضح الآن أن ما أريد فعله هو أولاً تحديد ما إذا كانت الكميتين المطلوب مقارنتهما موجودتين في نفس نظام الإحداثيات.(مثل الوحدات الزمنية التي تشير إلى عصور مختلفة أو مناطق زمنية أو ديسيبل إلى السعة المستقيمة)، قم بإجراء التحويل المناسب، ثم قم بإجراء التحويل.هل هناك أي أدوات لإدارة نظام الإحداثيات العامة؟هذا سيكون رائع.

سأفترض أن °F و°C يشيران دائمًا إلى Δ°F Δ°C ضمن التعبير ولكنهما يشيران إلى المطلق عند الوقوف بمفردهما.كنت أتساءل فقط إذا كان هناك طريقة للقيام بذلك units.degF وظيفة وصفعة الديكور property() عليه للتعامل مع هذين الشرطين.

ولكن في الوقت الراهن، سوف أقوم بتعيين units.C == units.K وحاول توضيح كيفية استخدام الوظائف في الوثائق convertCtoK(...) و convertFtoR(...) عند التعامل مع الوحدات المطلقة.(أنا فقط أمزح.لا لن أفعل.)

هل كانت مفيدة؟

المحلول

أنا شخصيا أحب كميات بفضل لها NumPy التكامل، إلا أنه لا يفعل إلا درجات الحرارة النسبية، وليس المطلقة.

نصائح أخرى

تحتوي وثائق Unum على كتابة جيدة جدًا حول سبب صعوبة ذلك:

Unum غير قادر على التعامل بشكل موثوق مع التحويلات بين درجة مئوية وكلفن.يشار إلى المشكلة باسم "مشكلة الأصل الزائف":يتم تعريف 0 درجة مئوية على أنها 273.15 ك.هذه حالة خاصة ومزعجة حقًا، نظرًا لأن القيمة 0 بشكل عام لا تتأثر بتحويل الوحدات، على سبيل المثال.0 [م] = 0 [أميال] = ....هنا، يتميز التحويل كلفن/درجة مئوية بعامل 1 وإزاحة قدرها 273.15 كلفن.الإزاحة غير ممكنة في الإصدار الحالي من Unum.

علاوة على ذلك، من المفترض أنه لن يتم دمجها أبدًا في الإصدار المستقبلي نظرًا لوجود مشكلة مفاهيمية أيضًا:يجب تطبيق الإزاحة إذا كانت الكمية تمثل درجة حرارة مطلقة، ولكن لا ينبغي تطبيقها إذا كانت الكمية تمثل اختلافًا في درجات الحرارة.على سبيل المثال، ارتفاع درجة الحرارة بمقدار 1 درجة مئوية يعادل ارتفاعًا بمقدار 1 كلفن.من المستحيل تخمين ما يدور في ذهن المستخدم، سواء كانت درجة حرارة مطلقة أو نسبية.إن مسألة الكميات المطلقة مقابل الكميات النسبية غير مهمة بالنسبة للوحدات الأخرى لأن الإجابة لا تؤثر على قاعدة التحويل.Unum غير قادر على التمييز بين الحالتين.

من السهل جدًا رؤية المشكلات من الناحية المفاهيمية عند محاولة تمثيل تحويل درجة الحرارة المطلقة بشكل رمزي.مع أي وحدة نسبية عادية، (x unit) * 2 == (x * 2) unit—وحدة الرياضيات تبادلية.مع درجات الحرارة المطلقة، ينهار ذلك، فمن الصعب القيام بأي شيء أكثر تعقيدًا من التحويلات المباشرة لدرجة الحرارة بدون أبعاد وحدة أخرى.ربما يكون من الأفضل لك الاحتفاظ بجميع الحسابات بالكلفن، والتحويل من وإلى وحدات درجة الحرارة الأخرى فقط عند نقاط الدخول والخروج من الكود الخاص بك.

مثال كيف يمكن أن تعمل:

>>> T(0*F) + 10*C
T(265.37222222222221*K) # or T(47767/180*K)
>>> T(0*F + 10*C)
T(283.15*K)
>>> 0*F + T(10*C)
T(283.15*K)
>>> 0*F + 10*C
10*K
>>> T(0*F) + T(10*C)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'absolute_temperature' and \
'absolute_temperature'
>>> T(0*F) - T(10*C)
T(245.37222222222223*K) # or T(44167/180*K)
>>> 0*F - 10*C
-10*K

ال ناتو تتعامل الحزمة مع وحدات درجة الحرارة.على سبيل المثال، يمكنك القيام بذلك:

>>> from natu.units import K, degC, degF
>>> T = 25*degC
>>> T/K
298.1500
>>> T/degF
77.0000
>>> 0*degC + 100*K
100.0 degC

البادئات مدعومة أيضًا:

>>> from natu.units import mdegC
>>> 100*mdegC/K
273.2500

ناتو يتعامل أيضًا مع الوحدات غير الخطية مثل ديسيبل, ، وليس فقط أولئك الذين لديهم إزاحات مثل درجة مئوية و درجة فهرنهايت.

فيما يتعلق بالمثال الأول الذي قدمته، يمكنك القيام بذلك:

>>> from natu import units
>>> 12*units.inch/units.m
0.3048

وحدة حرارية بريطانية تم بناؤه بالفعل.يمكنك تغيير وحدة العرض الخاصة بها إلى m**2*kg/s**2، ولكن بشكل افتراضي ناتو يبسط الوحدة إلى J:

>>> from natu.units import BTU
>>> BTU.display = 'm2*kg/s2'
>>> 1*BTU
1055.05585262 J
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top