Интегралҳо ва муодилаҳои дифференсиалӣ
Интеграл ва муодилаи ҳаракат барои чӣ лозиманд
Суръат, тавоноӣ ва сарфи ҷараён нишон медиҳанд, ки чизе бо кадом суръат тағйир меёбад. Барои ёфтани натиҷаи ҷамъшуда — масофа, энергия ё ҳаҷм — саҳми ҳамаи фосилаҳои хурдро ҷамъ кардан лозим аст. Интеграли муайян ҳамин гуна ҷамъи бефосила мебошад. Модули scipy.integrate онро ададӣ ҳисоб мекунад, ҳатто агар навиштани функсияи ибтидоӣ душвор бошад.
Саволи дигар вақте пайдо мешавад, ки худи бузургӣ маълум нест, вале қоидаи тағйирёбии он маълум аст: нӯшокӣ чӣ гуна хунук мешавад ё бори пружина чӣ гуна ҳаракат мекунад. Он гоҳ муодилаи дифференсиалӣ бо ҳолати ибтидоии маълум ҳал карда мешавад. Се ҳолатро фарқ кунед: формулаи функсия, ҷадвали ченкуниҳо ё ҳосилаи ҳолат дода шудааст.
1. Формулаи функсия: quad
quad(f, a, b) функсия ва ҳудудҳои интегралгириро қабул мекунад. Ду адад бармегарданд: қимати тақрибӣ ва арзёбии хатои мутлақ. Ин арзёбии алгоритми ададӣ аст, на хатои дақиқ ё номуайянии ченкуниҳо. Дар мисоли навбатӣ интеграли косинус аз сифр то нисфи π ба як баробар аст. Гирдкунӣ танҳо барои хондани осони натиҷа истифода мешавад.
import math
from scipy.integrate import quad
value, err = quad(math.cos, 0, math.pi / 2)
print(round(value, 8))
print(err < 1e-10)
Натиҷа:
1.0
True
Интеграл аломатро ба ҳисоб мегирад: қисмҳои зери меҳвар саҳми манфӣ медиҳанд ва иваз кардани тартиби ҳудудҳо аломати ҷавобро иваз мекунад. Аз ин рӯ, интеграли суръати аломатдор ҷойивазкуниро медиҳад; барои масофаи тайшуда модули суръатро интеграл гирифтан лозим аст. Воҳидҳо низ зарб мешаванд: метр дар сония × сония = метр.
from scipy.integrate import quad
print(round(quad(lambda x: x, -1, 1)[0], 6))
print(round(quad(lambda x: abs(x), -1, 1)[0], 6))
print(round(quad(lambda x: abs(x), 1, -1)[0], 6))
Натиҷа:
0.0
1.0
-1.0
2. Параметрҳо ва ҳудудҳои беохир
Аргументҳои иловагии функсия тавассути args дода мешаванд. Ҳатто як аргументро ҳамчун кортежи (3,) менависанд: вергул ҳатмист. Барои интегралҳои ғайрихосси наздикшаванда math.inf ва -math.inf иҷозатанд. Қабули ҳудуди беохир наздикшавиро кафолат намедиҳад: интеграли доимӣ дар фосилаи беохир қимати ниҳоӣ надорад.
import math
from scipy.integrate import quad
def f(x, p):
return x ** p
print(round(quad(f, 0, 1, args=(3,))[0], 6))
print(round(quad(lambda x: math.exp(-2 * x), 0, math.inf)[0], 6))
Натиҷа:
0.25
0.5
quad дар дохил чӣ гуна кор мекунад
Алгоритм арзёбиҳои тақрибии интегралро муқоиса карда, қисмҳои душворро ба фосилаҳои хурдтар ҷудо мекунад. Дар ҷойи тағйирёбии тез ҳисобкуниҳои бештар ва дар қисми ҳамвор камтар лозим мешаванд. Ин квадратураи мутобиқшаванда аст. epsabs ва epsrel таҳаммулпазириҳои мутлақ ва нисбии дилхоҳро муайян мекунанд. Қуллаи хеле борик ё кандашавӣ метавонад тақсимоти махсуси соҳаро талаб кунад; адади зебои чопшуда худ аз худ дақиқиро исбот намекунад.
3. Ҷадвали ченкуниҳо: trapezoid
Агар формула набошад, қимати навро дар ҳар нуқтаи дилхоҳ пурсидан мумкин нест. Қоидаи трапетсияҳо ченкуниҳои ҳамсояро бо хатҳои рост мепайвандад. Дар ҳар фосила масоҳат ба баландии миёна зарби паҳно баробар аст. Тартиби аргументҳо: аввал y, баъд x; паҳноҳо аз x гирифта мешаванд, бинобар ин қадам метавонад нобаробар бошад. Нуқтаҳо бо тартиби додашуда истифода мешаванд ва худкор мураттаб намегарданд.
from scipy.integrate import trapezoid
x = [0, 1, 3]
y = [1, 3, 3]
print(trapezoid(y, x=x))
print(trapezoid(y))
Натиҷа:
8.0
5.0
Бе x китобхона қадами воҳидиро фарз мекунад: сатри дуюм масъалаи дигарро ҳал мекунад. Барои каҷхатҳои ҳамвортар баъзан қоидаи Симпсон, simpson(y, x=x), фоиданок аст, вале агар усул дар шарт муайян шуда бошад, онро ба ҷойи трапетсияҳо истифода бурдан мумкин нест. Формулаи мураккабтар низ лаппишҳои номаълумро байни ченкуниҳои кам барқарор намекунад.
4. Аз суръати тағйирёбӣ ба ҳолат: solve_ivp
Дар y′ = f(t, y) функсияи тарафи рост ҳосила медиҳад, на ҳолати навбатиро. Ба ҳалкунанда фосилаи вақт ва ҳолати ибтидоии y0 лозиманд. Ҳатто барои як бузургӣ y0 рӯйхат аст. Масалан, фарқи ҳарорат аз ҳарорати хона бо суръати мутаносиб ба худи фарқ кам мешавад. Модели поён аз фарқи 8 оғоз карда, бо гузашти вақт ба сифр наздик мешавад.
from scipy.integrate import solve_ivp
sol = solve_ivp(lambda t, y: [-0.5 * y[0]], (0, 4), [8],
t_eval=[0, 2, 4], rtol=1e-9, atol=1e-11)
print(sol.t.tolist())
print(sol.y[0].round(6).tolist())
print(sol.y.shape, bool(sol.success))
Натиҷа:
[0, 2, 4]
[8.0, 2.943036, 1.082682]
(1, 3) True
sol.y ҷадвал аст: ҳар сатр ба ҷузъи ҳолат ва ҳар сутун ба лаҳзаи вақт мувофиқ аст. t_eval лаҳзаҳои пешниҳоди натиҷа-ро медиҳад, на қадами дохилии интегралгириро. Бо нобаёнӣ усули мутобиқшавандаи RK45 хатои қадамро арзёбӣ карда, дарозии онро тағйир медиҳад. rtol ва atol-и хурдтар одатан кори бештар талаб мекунанд; дақиқии нобаёнӣ (rtol=1e-3, atol=1e-6) метавонад барои таҳаммулпазирии қатъии масъала кофӣ набошад. Ҳамеша sol.success-ро санҷед.
5. Ҳосилаи дуюм ҳамчун система
Барои x″ = -x суръати v = x′-ро ворид мекунем. Ҳолат [x, v] ва ҳосилаи он [v, -x] мешавад. Ҷузъи якум тағйирёбии мавқеъ ва ҷузъи дуюм тағйирёбии суръатро нишон медиҳад. Ин гузариш имкон медиҳад, ки ҳамон ҳалкунандаи тартиби якум барои лаппишҳо истифода шавад. Тартиби ҷузъҳои ҳосила бояд бо тартиби ҷузъҳои ҳолат яксон бошад.
from scipy.integrate import solve_ivp
def rhs(t, s):
x, v = s
return [v, -x]
sol = solve_ivp(rhs, (0, 2), [1, 0], t_eval=[0, 1, 2],
rtol=1e-10, atol=1e-12)
print(sol.y[0].round(6).tolist())
print(sol.y[1].round(6).tolist())
Натиҷа:
[1.0, 0.540302, -0.416147]
[0.0, -0.841471, -0.909297]
Хатоҳои маъмул ва ислоҳи онҳо
value = quad(f, a, b)ҷуфтро нигоҳ медорад, бинобар ин ифодаиvalue + 1баTypeErrorмеорад. Ислоҳ:value, err = quad(f, a, b)ё гирифтани[0].trapezoid(x, y)координатаҳо ва қиматҳоро ҷойиваз карда, интеграли дигарро ҳисоб мекунад. Ислоҳ:trapezoid(y, x=x); тартиби вақт ва воҳидҳоро низ санҷед.solve_ivp(f, (0, 4), 8)ба ҷойи вектор скаляр дода,ValueErrorмеорад. Ислоҳ: ҳолати ибтидоии[8].sol.y[-1]ба ҷойи лаҳзаи охирин ҷузъи охиринро дар ҳамаи лаҳзаҳо мегирад. Ислоҳ:sol.y[:, -1]ҳамаи ҷузъҳоро дар лаҳзаи охирин ваsol.y[0, -1]ҷузъи якумро дар ҳамон лаҳза медиҳад. Дар мисоли лаппишҳо ҷузъҳо мавқеъ ва суръат мебошанд.
Зиёд кардани нуқтаҳои t_eval-ро бо баланд кардани дақиқӣ омехта накунед: барои дақиқӣ таҳаммулпазириҳои ҳалкунандаро тағйир медиҳанд.
Ёддошт
| Чӣ маълум аст | Даъват | Ҷойи ҷавоб |
|---|---|---|
| Формулаи функсия | quad(f, a, b, args=(p,)) |
Ҷуфти (value, err) |
| Ҷадвали қиматҳо | trapezoid(y, x=x) |
Адад, масоҳати зери хати шикаста |
| Ҳосила ва ҳолати ибтидоӣ | solve_ivp(f, (t0, t1), y0, t_eval=...) |
sol.t, sol.y, sol.success |
| Ҳосилаи дуюм | Ҳолати [x, v]-ро ворид кунед |
Ҳосилаи [v, шитоб] |
Барои quad дақиқиро бо epsabs, epsrel ва барои solve_ivp бо atol, rtol танзим мекунанд. Дар ҷавоби ададӣ аввал муваффақияти ҳисоб ва воҳидҳоро санҷида, баъд шакли лозими чопро интихоб мекунанд.