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

Муодилаҳо

Чаро муодилаҳоро рамзӣ ҳал мекунем

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

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

1. Баробариро чӣ гуна менависем

Муодила аз ду тараф иборат аст, ки бояд баробар бошанд. Eq(left, right) баробарии математикӣ месозад. Агар ба solve як ифода диҳед, функсия онро ба сифр баробар мекунад. Аргументи дуюм номаълумро ошкоро нишон медиҳад.

from sympy import symbols, Eq, solve
x = symbols('x')
print(Eq(4*x + 3, 10))
print(solve(Eq(4*x + 3, 10), x))
print(solve(4*x - 7, x))

Натиҷа:

Eq(4*x + 3, 10)
[7/4]
[7/4]

Баъди гузаронидани аъзоҳо ҳар ду навишт як шартро тавсиф мекунанд. Ҷавоби [7/4] рӯйхатест бо як решаи дақиқ. Барои навишти матнии дорои = аввал сатрро ба тарафҳои чапу рост ҷудо мекунанд, сипас ҳар кадомро бо sympify табдил медиҳанд. Тамоми сатри дорои =-ро ҳамчун ифодаи одии арифметикӣ додан мумкин нест.

2. Соҳаи ҷустуҷӯи ҳалҳо

Ададҳои ҳақиқӣ дар тири ададӣ ҷойгиранд. Ададҳои комплексӣ воҳиди мавҳуми I-ро дар бар мегиранд, ки барои он I**2 = -1 аст. Рамзи одӣ бо қиматҳои ҳақиқӣ маҳдуд нест, бинобар ин solve метавонад решаҳои комплексӣ диҳад.

solveset маҷмӯи ҳалҳоро бармегардонад; параметри domain соҳаи ҷустуҷӯро ошкоро муайян мекунад. S.Reals ададҳои ҳақиқӣ ва EmptySet маҷмӯи холиро ифода мекунанд.

from sympy import symbols, solve, solveset, S
x = symbols('x')
print(solve(x**2 + 9, x))
print(solveset(x**2 + 9, x, domain=S.Reals))
print(solveset(x**2 - 9, x, domain=S.Reals))

Натиҷа:

[-3*I, 3*I]
EmptySet
{-3, 3}

Роҳи дигари маҳдуд кардани номаълум сохтани он бо фарзияи real=True аст. Соҳаашро пешакӣ интихоб кунед, на ин ки қисми мавҳуми ҷавоби комплексиро партоед: ин кор ҳалро дигар мекунад.

Муодилаҳои даврӣ, масалан sin(x) = 0, ҳалҳои беохир доранд. Ҷавоби маҷмӯии solveset чунин оилаҳои ҳалҳоро тавсиф карда метавонад. Формати натиҷаҳои solve ва solveset гуногун аст; онҳоро ҳамчун як навъ коркард кардан мумкин нест.

3. Бисёраъзогиҳо ва каратҳо

Бисёраъзогӣ суммаи дараҷаҳои тағйирёбанда бо коэффитсиентҳост. Poly(expr, x) бисёраъзогиро нисбат ба x ошкоро месозад; degree() дараҷа ва all_coeffs() коэффитсиентҳоро аз дараҷаи баландтарин то аъзои озод, бо шумули сифрҳо, бармегардонанд.

Карати реша нишон медиҳад, ки зарбкунандаи мувофиқ чанд бор дар ҷудокунӣ меояд. roots луғати «реша → карат» ва real_roots рӯйхати решаҳои ҳақиқиро бо такрорҳо бармегардонанд.

from sympy import symbols, Poly, roots, real_roots
x = symbols('x')
p = Poly((x + 2)**2*(x - 4), x)
print(p.degree(), p.all_coeffs())
print(roots(p.as_expr(), x))
print(real_roots(p))

Натиҷа:

3 [1, 0, -12, -16]
{4: 1, -2: 2}
[-2, -2, 4]

Коэффитсиенти сифрии назди x**2 партофта нашуд. Қимати -2 дар рӯйхат ду бор омадааст, зеро зарбкунандаи (x + 2) ба квадрат бардошта шудааст. real_roots решаҳои ҳақиқиро бо тартиби афзоиш ҷой медиҳад. Барои коэффитсиентҳои ратсионалии дақиқ ин восита аз таҳлили дастии формулаҳои мураккаби радикалӣ фоиданоктар аст.

На ҳар решаро бо радикалҳои шинос навиштан мумкин аст. Объекти CRootOf решаи дақиқи бисёраъзогиро нигоҳ медорад ва қимати тақрибии даҳии онро алоҳида мегиранд.

from sympy import symbols, real_roots, N
x = symbols('x')
r = real_roots(x**5 - x - 1)[0]
print(r)
print(N(r, 8))

Натиҷа:

CRootOf(x**5 - x - 1, 0)
1.1673040

Ин хато ё сатри муваққатӣ нест: бо чунин реша ҳисобро давом додан мумкин аст. Дар айни ҳол, roots на ҳамеша ҳамаи решаҳои бисёраъзогии дилхоҳро меёбад; барои решаҳои ҳақиқии бисёраъзогиҳои дорои коэффитсиентҳои ратсионалӣ функсияи махсуси real_roots-ро истифода баред.

4. Системаҳои муодилаҳо

Система талаб мекунад, ки якчанд шарт ҳамзамон иҷро шаванд. Муодилаҳо дар як рӯйхат ва номаълумҳо дар рӯйхати дигар дода мешаванд. Параметри dict=True шакли ҷавобро қулай мекунад: рӯйхати луғатҳо, ки ҳар кадом як ҳалро тавсиф мекунад.

from sympy import symbols, solve
x, y = symbols('x y')
result = solve([x + 2*y - 8, x - y - 2], [x, y], dict=True)
print(result)
print(result[0][x], result[0][y])

Натиҷа:

[{x: 4, y: 2}]
4 2

Калидҳои луғат объектҳои рамзии x ва y мебошанд, на сатрҳои "x" ва "y". Қиматҳоро бо ҳамон рамзҳое гиред, ки ҳангоми сохтани система истифода шудаанд.

Системаи ғайрихаттӣ метавонад якчанд ҳал дошта бошад. Дар мисоли навбатӣ парабола хати рости уфуқиро дар ду нуқта мебурад; ҳар луғат ҷуфти пурраи координатаҳоро дар бар мегирад.

from sympy import symbols, solve
x, y = symbols('x y')
print(solve([y - x**2, y - 9], [x, y], dict=True))

Натиҷа:

[{x: -3, y: 9}, {x: 3, y: 9}]

Ҷавоби системаи таназзулёфта метавонад параметрҳои озод дошта бошад ё ҳал надошта бошад. Ҳамеша як луғати дорои адад барои ҳар тағйирёбандаро интизор шудан мумкин нест: ин бояд аз шарти масъала барояд.

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

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

Барои муодилаи мураккаб формулаи дақиқ метавонад дастрас набошад. nsolve решаи ададиро дар наздикии қимати ибтидоии тақрибӣ меҷӯяд. Ин воситаи дигар аст: натиҷа тақрибӣ мебошад ва як даъват ёфтани ҳамаи решаҳоро кафолат намедиҳад.

from sympy import symbols, cos, nsolve, N
x = symbols('x')
r = nsolve(cos(x) - x, x, 1)
print(N(r, 8))

Натиҷа:

0.73908513

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

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

1. Навиштани шарт бо ==. Ин муқоиса метавонад фавран ба ҷойи муодила қимати мантиқӣ диҳад. Eq ё фарқи тарафҳоро истифода баред.

from sympy import symbols, Eq, solve
x = symbols('x')
print(x + 1 == 3)
print(solve(Eq(x + 1, 3), x))

Натиҷа:

False
[2]

2. Омехтани решаҳои гуногун ва каратҳо. Дар ин ҷо solve решаро як бор ва real_roots ду бор бармегардонад. Тасвирро аз рӯйи шарт интихоб кунед, на аз намуди мисол.

from sympy import symbols, solve, real_roots
x = symbols('x')
print(solve((x - 4)**2, x))
print(real_roots((x - 4)**2))

Натиҷа:

[4]
[4, 4]

3. Ҳисоб кардани is_real ҳамчун парчами танҳо дуқимата. Агар маълумот дар бораи рамз кофӣ набошад, SymPy None медиҳад, яъне «номаълум», на «ҳатман ҳақиқӣ нест».

from sympy import symbols
a = symbols('a')
print(a.is_real)
b = symbols('b', real=True)
print(b.is_real)

Натиҷа:

None
True

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

4. Интизор шудани як навъи ҷавоб аз ҳамаи даъватҳо. solve(expr, x) аксаран рӯйхати решаҳоро медиҳад; система бе dict=True метавонад луғат ё рӯйхати кортежҳо диҳад. Муроҷиат ба рӯйхат мисли луғат хато меорад. Барои системаҳо аз аввал dict=True истифода бурда, рӯйхати ҳосилшударо паймоиш кунед.

from sympy import symbols, solve
x, y = symbols('x y')
result = solve([x + 2*y - 8, x - y - 2], [x, y], dict=True)
try:
    print(result[x])
except TypeError as err:
    print(type(err).__name__)
print(result[0][x])

Натиҷа:

TypeError
4

Аввал луғат аз рӯйхат интихоб мешавад, баъд қимат бо рамз гирифта мешавад. Агар ҳалҳо якчанд бошанд, ҳар луғатро коркард кунед, на танҳо якумро.

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

Талабот Даъват
Баробарии ду тараф Eq(left, right)
Решаҳои ифодаи ба сифр баробар solve(expr, x)
Маҷмӯи ҳалҳои ҳақиқӣ solveset(expr, x, domain=S.Reals)
Дараҷа ва коэффитсиентҳо Poly(expr, x)
Решаҳо ва каратҳо дар луғат roots(expr, x)
Ҳамаи решаҳои ҳақиқӣ бо такрорҳо real_roots(expr)
Система бо шакли ягонаи ҷавоб solve(equations, variables, dict=True)
Ҷустуҷӯи ададӣ дар наздикии нуқта nsolve(expr, x, guess)

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