Гузариш ба мундариҷа
Мавзӯи 1 аз 5

Рамзҳо ва ифодаҳо

Математикаи рамзӣ барои чӣ лозим аст

Ҳангоми кор бо формулаҳо баъзан каср ё решаро дақиқ нигоҳ доштан лозим аст, на ин ки фавран қимати тақрибии даҳӣ гирем. Масалан, омӯзгор айниятро месанҷад, муҳандис пеш аз гузоштани натиҷаҳои ченкунӣ формуларо табдил медиҳад ва муҳаққиқ вобастагии натиҷаро аз параметр меёбад. SymPy имкон медиҳад, ки бо ҳарфҳо ва амалҳо мисли рӯйи коғаз кор кунем.

Тартиби маъмули кор чунин аст: рамзҳоро созед, ифода тартиб диҳед, табдилро интихоб кунед, қиматҳоро ҷойгузин намоед ва танҳо дар охир, агар лозим бошад, гирд кунед. Ин алгебраро аз ҳисоби ададӣ ҷудо мекунад ва намегузорад, ки хатои тақрибӣ барвақт ҷамъ шавад.

1. Рамз ва ифода

Рамз объектест, ки адади номаълумро ифода мекунад. Тағйирёбандаи Python бо номи x ҳамин объектро нигоҳ медорад; ҳоло доштани қимати ададии мушаххас шарт нест. symbols("x y") ду рамз месозад. Ифода рамзҳо, ададҳо ва амалҳоро муттаҳид мекунад.

from sympy import symbols
x, y = symbols('x y')
e = 3*x + x + 2
print(e)
print(e.free_symbols)
print((x + y)**2)

Натиҷа:

4*x + 2
{x}
(x + y)**2

Ҷамъшавандаҳои монанди 3*x ва x фавран якҷо шуданд. Аммо квадрати сумма дар қавс монд: SymPy ҳамаи қавсҳоро худкор намекушояд. Хосияти free_symbols маҷмӯи рамзҳои озодро нишон медиҳад, яъне ҳарфҳоеро, ки ифода аз онҳо вобаста аст. Тартиби унсурҳои маҷмӯъро ҳамчун тартиби тағйирёбандаҳо барои барориш истифода набаред.

2. Ададҳои дақиқ ва қиматҳои тақрибӣ

Адади ратсионалӣ нисбати ду адади бутун аст. Rational(p, q) сурат ва махраҷро дақиқ нигоҳ дошта, касрро ихтисор мекунад. sqrt решаро дар шакли рамзӣ нигоҳ медорад. N(expr, n) қимати тақрибиро бо шумораи додашудаи рақамҳои маънодор ҳисоб мекунад, на бо шумораи рақамҳои баъди вергул.

from sympy import Rational, sqrt, N
print(Rational(2, 7) + Rational(3, 7))
print(sqrt(18))
print(N(sqrt(3), 8))

Натиҷа:

5/7
3*sqrt(2)
1.7320508

Дар қадамҳои мобайнӣ қиматҳои дақиқро нигоҳ доштан қулай аст. Методи expr.evalf(n) ҳамон қимати тақрибии ададиро медиҳад, ки N(expr, n) медиҳад. Баланд кардани дақиқии барориш дақиқии ҳангоми сохтани float гумшударо барқарор намекунад.

3. Формула аз сатр

Матн ва ифодаи математикӣ объектҳои гуногунанд. sympify сатрро аз рӯйи синтаксиси Python таҳлил карда, ифодаи SymPy месозад. Номҳои номаълум, ба монанди u, ба рамз табдил меёбанд; ададҳои дохили сатр бо воситаҳои SymPy коркард мешаванд.

from sympy import sympify
e = sympify('u**2 + 2*u + 1')
print(e)
print(sympify('2/7') + sympify('3/7'))

Натиҷа:

u**2 + 2*u + 1
5/7

Зарбро ошкоро нависед: 2*u, ва дараҷаро бо u**2. Ин функсия барои формулаҳои боэътимод пешбинӣ шудааст: он механизмҳои иҷрои Python-ро истифода мебарад ва барои иҷрои бехатари матни худсаронаи бегона мувофиқ нест. Дар масъалаҳои курс синтаксиси ифодаҳо бо шарт маҳдуд шудааст.

4. Интихоби табдил

Як формуларо дар шаклҳои гуногун навиштан мумкин аст. expand қавсҳоро мекушояд, factor бисёраъзогиро ба зарбкунандаҳо бо коэффитсиентҳои ратсионалӣ ҷудо мекунад ва simplify содакуниҳои мувофиқро месанҷад. Аввал муайян кунед, ки кадом шакл лозим аст, баъд функсияро интихоб намоед.

from sympy import symbols, expand, factor, simplify
x = symbols('x')
print(expand((x + 4)**2))
print(factor(x**2 + 8*x + 16))
print(simplify((x**2 - 16)/(x - 4)))

Натиҷа:

x**2 + 8*x + 16
(x + 4)**2
x + 4

Сатри охир аз ихтисори зарбкунандаи умумӣ ҳосил шуд. Касри аслӣ дар x = 4 муайян нест, ҳарчанд формулаи содашуда дар он нуқта қимат дорад. Ҳангоми табдили ифодаҳои ратсионалӣ маҳдудиятҳои соҳаи муайяниро алоҳида ба назар гирифтан лозим аст.

simplify шакли мушаххаси натиҷаро кафолат намедиҳад. Формулаҳои аз ҷиҳати математикӣ баробар баъди табдилҳои гуногун метавонанд гуногун чоп шаванд. Барои ҷавоб бо шакли талабшуда маҳз амали зикршуда ва print-и одиро истифода баред; pprint барои намоиши хонданбоб, баъзан дар чанд сатр аст, ва latex навишти LaTeX-ро бармегардонад.

5. Ҷойгузинӣ бе тағйири нусхаи аслӣ

Методи subs рамзро бо адад ё ифодаи дигар иваз мекунад. Як тағйирёбандаро иваз кардан ё луғати ивазкуниҳоро додан мумкин аст. Агар ҳамаи қиматҳо дақиқ бошанд, натиҷа низ дақиқ мемонад.

from sympy import symbols, Rational
x, y = symbols('x y')
e = 2*x + y**2
print(e.subs(x, Rational(3, 2)))
print(e.subs({x: Rational(3, 2), y: 2}))
print(e)

Натиҷа:

y**2 + 3
7
2*x + y**2

Аввал танҳо x иваз шуд, бинобар ин y дар формула монд. Сипас ҳар ду рамз иваз шуданд ва адад ҳосил шуд. Сатри охир ифодаи аслиро нишон медиҳад: subs объекти нав бармегардонад. Луғати қиматҳои ададӣ вақте қулай аст, ки ивазкуниҳо аз ҳам вобаста набошанд; барои ивазкуниҳои вобаста тартиб ё ҳолати simultaneous=True муҳим аст.

Ин дар дохил чӣ гуна кор мекунад

Ифода ба дарахт монанд аст. Гиреҳи ҷамъ ҷамъшавандаҳоро, гиреҳи зарб зарбкунандаҳоро ва гиреҳи дараҷа асосу нишондиҳандаро нигоҳ медорад. func навъи амали болоиро, args қисмҳои бевоситаи онро ва srepr навишти муфассали сохторро нишон медиҳад.

from sympy import symbols, srepr
x = symbols('x')
e = x + 2
print(e.func.__name__)
print(e.args)
print(srepr(e))

Натиҷа:

Add
(2, x)
Add(Symbol('x'), Integer(2))

Дар args-и дохилӣ адад аввал омадааст, гарчанде ҳангоми чопи одӣ x аввал меояд. Тасвир барои нигоҳдорӣ ва намоиш барои инсон вазифаҳои гуногун доранд. Табдил дарахтро мегардад ва аз рӯйи қоидаҳои алгебра дарахти нав месозад. Якҷо кардани худкори қисмҳои содда ифодаро кӯтоҳ мекунад, вале ҷойи табдили интихобкардаи корбарро намегирад.

Хатоҳои маъмул ва ислоҳи онҳо

1. Пеш аз муроҷиат ба SymPy сохтани касри тақрибӣ. Дар x + 2/7 тақсими ададҳои бутунро Python иҷро мекунад ва ба ифода аллакай float дохил мешавад. Ду адади бутунро ба Rational диҳед.

from sympy import symbols, Rational
x = symbols('x')
print(x + 2/7)
print(x + Rational(2, 7))

Натиҷа:

x + 0.285714285714286
x + 2/7

2. Истифодаи ^ барои дараҷа. Дар Python ин амали дигар аст ва бо рамз TypeError медиҳад. Навишти дуруст ** аст.

from sympy import symbols
x = symbols('x')
try:
    print(x ^ 2)
except TypeError as err:
    print(type(err).__name__)
print(x**2)

Натиҷа:

TypeError
x**2

3. Интизор шудан, ки subs ифодаро тағйир медиҳад. Даъват бе нигоҳ доштани натиҷа e-ро тағйир намедиҳад. Объекти баргаштаро ба тағйирёбанда нисбат диҳед.

from sympy import symbols
x = symbols('x')
e = x + 4
e.subs(x, 1)
print(e)
e = e.subs(x, 1)
print(e)

Натиҷа:

x + 4
5

4. Санҷидани айният бо ==. Он сохтори ифодаҳоро муқоиса мекунад ва барои ду навишти як формула метавонад False диҳад. Барои ин бисёраъзогиҳо месанҷем, ки оё фарқ то сифр сода мешавад.

from sympy import symbols, expand, simplify
x = symbols('x')
a = (x + 4)**2
b = expand(a)
print(a == b)
print(simplify(a - b))

Натиҷа:

False
0

Ин санҷиш барои алгебра фоиданок аст, вале дар ҳолати умумӣ натиҷаи содакуниро бо назардошти соҳаи муайянӣ шарҳ додан лозим аст.

Ёдномаи кӯтоҳ

Вазифа Восита
Сохтани ҳарфҳо symbols("x y")
Нигоҳ доштани касри дақиқ Rational(p, q) ё Rational("p/q")
Таҳлили матни формула sympify(text)
Кушодани қавсҳо / ҷудо кардан ба зарбкунандаҳо expand(e) / factor(e)
Кӯшиши содакунӣ simplify(e)
Ҷойгузинии қиматҳо e.subs({x: value})
Гирифтани қимати тақрибӣ e.evalf(n) ё N(e, n)

Пеш аз барориш санҷед, ки касри дақиқ лозим аст ё қимати тақрибӣ, оё ҳамаи рамзҳо иваз шудаанд ва оё шакли ифода ба шарти масъала мувофиқ аст.