
عند حل مشاكل النمذجة الرياضية للعمليات والأشياء ، غالبًا ما يكون عمليًا جدًا استخدام خوارزميات Python باستخدام الحسابات الرمزية. استنادًا إلى مكتبة SymPy ، تتوافق Python بنجاح مع حل المعادلات والأنظمة ، والدمج والتمييز ، وحساب الحدود ، والتوسع في السلسلة وسلسلة التلخيص ، وتبسيط التعبيرات ، والبحث عن حلول للمعادلات والأنظمة التفاضلية.
عند استخدام الحسابات الرمزية ، يتم منح المستخدم الفرصة للتحكم في البرنامج أثناء تنفيذه عن طريق إدخال أي وظائف صالحة مع عدد معين من المتغيرات.
بصفتي معلمًا في تخصص "هندسة الكمبيوتر والبرمجة" ، في الوحدة النمطية للبرمجة في Python ، أقدم الطلاب إلى إمكانيات هذه اللغة للبحث العلمي. انتباهك عبارة عن سلسلة من المقالات التي يمكنك من خلالها التعرف على الحوسبة الرمزية في Python. أريد أن أحذر على الفور من أن هذه المقالات لا تدعي التفرد المطلق ، حيث يتم جمعها على أساس مواد من مصادر مختلفة ، وهدفها هو تعليم الطلاب أساسيات الحوسبة الرمزية.
الخطوة الأولى نحو الحوسبة الرمزية هي استيراد وظائف وحدة SymPy باستخدام pip ، نظام إدارة حزم Python. إذا كان بإمكانك معالجة ذلك ، فلننتقل إلى الإعلان عن المتغيرات.
ملاحظة لتقصير السجل ، لا يظهر السطر التالي في جميع الأمثلة التالية: من استيراد sympy *إعلان صريح عن متغيرات الحرف
للحسابات الرمزية باستخدام وحدة
SymPy ، يجب الإعلان عن المتغيرات والوظائف الرمزية على هذا النحو. في برامج الحوسبة الرياضية مثل Mathematica أو Maple ، تعتبر المتغيرات رمزية على الفور. في Python ، يجب أن يتم الإعلان عنها بالقوة رمزيًا ، ويمكن القيام بذلك بعدة طرق. أسهل طريقة هي استخدام دالات
الرموز () أو
var () . تعرض الدالة الأولى مرجعًا لكائن حرف كمتغير. الثاني ، بدون تعيين ، يخلق متغير الحرف.
مثال على الرمز>>> x,y,a,b = symbols('xya b')
الاختلاف الرئيسي بين دالات
الرموز () و
var () هو أن الدالة الأولى ترجع مرجعًا إلى كائن الرمز. للاستخدام المستقبلي ، يجب تعيينه لأي متغير. الثاني ، بدون تعيين ، يخلق متغير الحرف.
في دالات الرموز () و var () ، يمكنك تعريف متغيرات الرمز بفهرس:
يمكنك أيضًا تعيين نوع وفرض قيود على متغيرات الرمز مباشرةً في وظيفتي الرموز () و var (). في بعض الأحيان بدون مثل هذه القيود ، لا تعمل التحولات الواضحة ، على سبيل المثال ، قارن:
مثال على الرمز >>> x = symbols('x', integer=True)
لإنشاء حاوية لحرف واحد ، استخدم الوسيطة
seq = True: >>> symbols('x',seq=True) (x,)
تحديد القيم الصالحة لمتغيرات الحروف:
>>> x, y, z = symbols('x,y,z', real=True) >>> x.is_real and y.is_real and z.is_real True
الوظيفة s ()
في بعض الأحيان ، يمكن تفسير تعبيرات الأحرف على أنها ثوابت رقمية في Python بدلاً من SymPy. لذلك ، لإعلان المتغيرات الرمزية ، وكذلك لتحويل الثوابت العددية إلى رمزية ، استخدم الدالة S () ، على سبيل المثال ، قارن:
>>> expr = x**2 + sin(y) + S(10)/2; expr x**2 + sin(y) + 5 >>> type(10) <class 'int'> >>> type(S(10)) # <class 'sympy.core.numbers.Integer'>
الفرق بين ثابت Python وثابت الحرف هو أنه يمكن حساب ثابت الحرف بدرجة معينة من الدقة ، كما هو موضح في المثال التالي ، مقارنة بوظيفة
round () القياسية:
z=1/7; z
أسماء الشخصيات
إذا كنت بحاجة إلى استخدام الرياضيات الرمزية باستمرار في الجلسة الحالية ، فيمكنك استيراد أسماء رمزية شائعة من الوحدة النمطية
sympy.abc :
مثال على الرمز >>> import sympy.abc >>> dir(sympy.abc) ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_clash', '_clash1', '_clash2', 'a', 'alpha', 'b', 'beta', 'c', 'chi', 'd', 'delta', 'division', 'e', 'epsilon', 'eta', 'exec_', 'f', 'g', 'gamma', 'greeks', 'h', 'i', 'iota', 'j', 'k', 'kappa', 'l', 'lamda', 'm', 'mu', 'n', 'nu', 'o', 'omega', 'omicron', 'p', 'phi', 'pi', 'print_function', 'psi', 'q', 'r', 'rho', 's', 'sigma', 'string', 'symbols', 't', 'tau', 'theta', 'u', 'upsilon', 'v', 'w', 'x', 'xi', 'y', 'z', 'zeta']
يمكن إزالة اسم المتغير من مساحة الاسم باستخدام الأمر
del name1 ، name2 ، .. :
>>> type(x) <class 'sympy.core.symbol.Symbol'> >>> del x,y >>> x NameError: name 'x' is not defined
لاستعادة قيم الثوابت القياسية ، وكذلك أسماء بعض الوظائف ، تحتاج إلى إعادة تحميل وحدة sympy.
>>> from sympy import *
الطريقة الفرعية (...)
يجب أن نتذكر أنه عند كتابة تعبير رمزي ، يمكن إجراء تبسيطه تلقائيًا ، على سبيل المثال:
>>> a,b,c,d,x,y,z,u,v,w = symbols('abcdxyzuv w') >>> x - z + 20 -z- 15 + 3*sin(pi/2)+2*z x + 8
يتم استخدام طريقة
subs (...) لحساب تعبير حرف لقيم معينة من المتغيرات ، على سبيل المثال:
>>> a, x = symbols('a x') >>> f= a**3*x + 3*a**2*x**2/2 + a*x**3 + x**4/4 >>> f.subs(a,1)
إذا تم استخدام وسيطتين في طريقة الغواصات ، فسيتم تفسيرها على أنها غواصات (قديمة وجديدة) ، أي يتم استبدال المعرف القديم بالجديد الجديد. يمكن أن تكون الوسيطة للأسلوب subs () عبارة عن تسلسل يجب أن يحتوي على أزواج (قديم ، جديد) ، أو يمكن أن يكون تعبيرًا رمزيًا ، على سبيل المثال:
>>> a,b,c,d,x,y,z = symbols('abcdxy z') >>> f=a*x**3 +b*y**2 + c*z+d >>> f.subs([(a,1),(b,2),(c,3),(d,4)])
دعونا نلفت انتباهك إلى الخصوصية التالية للعمل مع المتغيرات (المتغيرات الرمزية والعادية في Python). قم بتشغيل التعليمات البرمجية التالية:
>>> x='Hello' >>> pr=x+'world' >>> pr 'Helloworld' >>> x='AAA'
تنطبق القاعدة هنا: إذا تم تغيير المتغير ، فلن يتم إعادة حساب التعبير الذي تم إنشاؤه مسبقًا والذي يحتوي على هذا المتغير تلقائيًا. تعمل هذه القاعدة أيضًا مع متغيرات Python العادية.
عمليات الكسر
يمكن لوحدة SymPy إجراء العمليات الحسابية باستخدام الكسور وإحضارها إلى قاسم مشترك ، على سبيل المثال ، قارن:
>>> S(1)/3+S(2)/5 11/15 >>> 1/3+2/5 0.7333333333333334
يتم استخدام الدالات
Rational (البسط والمقام) و
Integer (...) لإنشاء كسور عقلانية بدون تقريب عشري:
>>> z=Rational(1, 7)+Rational(2, 5); z 19/35 >>> Integer(1)/Integer(5) 1/5 >>> 1/5 0.2 >>> z=Integer(1)/Integer(5)+Rational(2, 7); z 17/35
تقريب الحوسبة
في الحوسبة الرمزية ، تعمل القاعدة - إذا لم يقال شيء ، لا تقربه. شاهد كيف في الحالة الأولى ، تقوم Python بتحويل التعبير ، ولكنها تترك الجذر التربيعي في سجل الاستجابة ولا تقوم بأي تقريب ، وفي الحالة الثانية ، حيث يتم تحديد أحد الأرقام بفاصلة عشرية ، ستكون النتيجة تقريبية:
>>> sqrt(20) 2*sqrt(5) >>> sqrt(20.0)
بالنسبة لأي كائن حرف ، توجد طريقة
Evalf (...) (
Eval uate
f loat) التي ترجع تمثيلها العشري:
>>> sqrt(20).evalf()
يمكن أن تستخدم طريقة
Evalf ([n، ...]) وسيطة تحدد دقة النتيجة (n = عدد الأرقام المهمة)
>>> sqrt(20).evalf(30) 4.47213595499957939281834733746 >>> pi.evalf(20) 3.1415926535897932385
تحتاج أيضًا دائمًا إلى تذكر أن الحساب الحقيقي لا يُرجع نتيجة دقيقة ، قارن:
>>> from sympy import * >>> one=S('one') >>> one = cos(1)**2 + sin(1)**2 >>> one.evalf()
إذا كان من المعروف أن النتيجة تحتوي على خطأ حسابي ، فيمكنك حذفها باستخدام الخيار
chop = True لطريقة Evalf () . يتم استبدال قيمة صغيرة جدًا للجزء الحقيقي أو التخيلي للنتيجة في هذه الحالة بصفر. خذ المثال السابق:
>>> (one-1).evalf()
اللانهاية
بعد تنفيذ السطر الأول
من استيراد sympy * ، يصبح الرمز اللامتناهي
oo (
حرفان "o") متاحًا ، حيث يمكنك أيضًا تنفيذ عمليات معينة:
>>> oo+1 oo >>> 1000000<oo True >>> 1/oo 0
يتم استخدام رمز اللانهاية بشكل رئيسي من خلال وظائف
الحد () ودمج () عند تعيين حدود التكامل ، والتي سنناقشها في إحدى المقالات التالية.
الخلاصة
تختلف العمليات الحسابية الرمزية الواردة في المقالة عن الأساليب العددية في أنه يمكن إجراء مزيد من الدراسة للنتائج ، على سبيل المثال ، لتحديد أقصى الوظائف ، وحل المعادلات مع المتغيرات المضمنة ، وما إلى ذلك.
آمل أن تكون مقالتي مفيدة لجميع المهتمين ببرمجة Python والطلاب والمشاركين في البحث العلمي.