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

Интерполятсия ва системаҳои хаттӣ

Чаро қиматҳоро барқарор карда, системаҳоро ҳал мекунем

Датчик бузургиро танҳо дар лаҳзаҳои алоҳида чен мекунад, вале ба барнома метавонад қимати байни ченкуниҳо лозим шавад. Интерполятсия функсияеро месозад, ки аз нуқтаҳои маълум мегузарад ва қиматҳои мобайниро ҳисоб мекунад. Он дар коркарди сигналҳо, аниматсия ва ҳисобҳои муҳандисӣ истифода мешавад. Ин модели рафтори байни нуқтаҳост, на ченкунии нав.

Вазифаи дигари маъмул ёфтани якчанд номаълумест, ки бо муодилаҳои хаттӣ пайвастанд. Модули scipy.linalg чунин системаҳоро ҳал карда, амалҳои матритсавиро иҷро мекунад. Ин вазифаҳо вобастаанд: коэффитсиентҳои каҷхатҳои ҳамвори интерполятсиониро низ аз системаҳои муодилаҳо гирифтан мумкин аст.

1. Интерполятсияи хаттӣ қадам ба қадам

Ҷуфтҳои (x, y) маълуманд: x координата ё вақт ва y қимат аст. Дар интерполятсияи хаттӣ нуқтаҳои ҳамсоя бо порчаҳои рост пайваст мешаванд. Барои ҳисоб дар дохили фосила ҳиссаи масофаи тайшударо ёфта, y-ро ба ҳамон ҳисса тағйир медиҳанд. Дар шабакаи нобаробар масофаи воқеии меҳвари x муҳим аст, на рақами элемент.

interp1d(x, y) объекти даъватшавандаи f месозад. Ин ҳанӯз як қимати ҳисобшуда нест: баъд f(t)-ро барои координатаи лозим даъват мекунанд. Як объектро такроран истифода бурда, ба он якбора рӯйхати дархостҳоро додан мумкин аст. Барои додаҳои якченака дарозии x ва y бояд баробар бошад ва координатаҳо набояд такрор шаванд.

from scipy.interpolate import interp1d

x = [0, 4, 10]
y = [4, 12, 6]
f = interp1d(x, y)
print(float(f(2)))
print(f([0, 2, 7, 10]).tolist())

Натиҷа:

8.0
[4.0, 8.0, 9.0, 6.0]

Дар фосилаи якум нуқтаи 2 дар миёна аст, бинобар ин қимат 8 мебошад. Дар фосилаи дуюм нуқтаи 7 низ дар миёна буда, қимат 9 мешавад. Формулаи порча: y0 + (y1 - y0) * (t - x0) / (x1 - x0). Китобхона барои ҳар дархост ҷуфти ҳамсояи мувофиқро меёбад. interp1d бо нобаёнӣ координатаҳои воридшударо ҳамроҳи қиматҳои мувофиқ мураттаб карда метавонад; CubicSpline координатаҳои аллакай афзояндаро талаб мекунад.

2. Тарзи интерполятсия ва баромадан аз ҳудуд

Параметри kind моделро иваз мекунад: "linear" хати шикаста ва "nearest" ченкунии наздиктаринро медиҳад. Натиҷаҳо фарқ мекунанд, бинобар ин тарзро аз рӯйи маънои масъала интихоб мекунанд. Экстраполятсия идома додани функсия берун аз нуқтаҳои маълум аст. Он аз интерполятсия фарқ дошта, метавонад беэътимод бошад. interp1d бо нобаёнӣ берун аз ҳудуд ValueError медиҳад; идомаро бо fill_value="extrapolate" ошкоро фаъол мекунанд.

from scipy.interpolate import interp1d

linear = interp1d([0, 4], [4, 12])
nearest = interp1d([0, 4], [4, 12], kind="nearest")
extended = interp1d([0, 4], [4, 12], fill_value="extrapolate")
print(float(linear(1)), float(nearest(1)))
try:
    linear(6)
except ValueError as error:
    print(type(error).__name__)
print(float(extended(6)))

Натиҷа:

6.0 4.0
ValueError
16.0

Барои интерполятсияи хаттии одӣ np.interp(t, x, y) мавҷуд аст. Рафтори он берун аз ҳудуд дигар аст: бо нобаёнӣ қимати канорӣ бармегардад. Ин барои нигоҳ доштани сатҳи охирини маълум қулай аст, вале ба идомаи хаттӣ баробар нест. Координатаҳои np.interp бояд афзоянд.

import numpy as np

print(np.interp([-1, 2, 6], [0, 4], [4, 12]).tolist())

Натиҷа:

[4.0, 8.0, 12.0]

3. Каҷхати ҳамвор: CubicSpline

Дар хати шикаста нишебӣ дар гиреҳҳо ҷаҳишвор тағйир меёбад. Сплайни кубӣ дар ҳар фосила бисёрузваи дараҷааш на бештар аз серо истифода мебарад. Қисмҳои ҳамсоя дар гиреҳҳо қиматҳо, ҳосилаҳои якум ва дуюми яксон доранд. Аз ин рӯ каҷхат ҳамвор мешавад, ки барои траекторияҳо ва тағйироти сигналҳо фоиданок аст. Вале ҳамворӣ набудани қуллаҳои иловагиро байни ченкуниҳо кафолат намедиҳад.

Барои интихоби ягонаи коэффитсиентҳо шартҳои сарҳадӣ лозиманд. bc_type="natural" ҳосилаи дуюмро дар ҳар ду канор сифр мекунад. Шартҳои нобаёнии "not-a-knot" ду қисми аввал ва ду қисми охирро ба як бисёрузва мепайванданд. Шартҳои гуногун аз як дода метавонанд каҷхатҳои гуногун диҳанд.

import numpy as np
from scipy.interpolate import CubicSpline

x = [0, 1, 2, 4]
y = [1, 3, 2, 0]
cs = CubicSpline(x, y, bc_type="natural")
print(cs(x).round(6).tolist())
print(round(float(cs(1.5)), 6))
print(np.abs(cs([0, 4], 2)).round(8).tolist())

Натиҷа:

[1.0, 3.0, 2.0, 0.0]
2.744565
[0.0, 0.0]

cs(t) қимат, cs(t, 1) ҳосилаи якум ва cs(t, 2) ҳосилаи дуюмро медиҳад. Агар y мавқеъ бошад, онҳо суръат ва шитобанд. Коэффитсиентҳо як бор сохта мешаванд ва баъд қимату ҳосилаҳоро дар нуқтаҳои зиёд гирифтан мумкин аст. Ҳосила аз бисёрузваҳои сплайн ҳисоб мешавад, на аз фарқи тақрибии дархостҳои ҳамсоя.

from scipy.interpolate import CubicSpline

cs = CubicSpline([0, 2], [1, 7], bc_type="natural")
print(float(cs(1)), float(cs(1, 1)), float(cs(1, 2)))

Натиҷа:

4.0 3.0 0.0

4. Система дар шакли матритсавӣ

Дар A x = b матритсаи A коэффитсиентҳо, вектори x номаълумҳо ва b тарафҳои ростро нигоҳ медорад. Сатрҳои матритса ба муодилаҳо ва сутунҳо ба номаълумҳо мувофиқанд. Масалан, сатрҳои [3, 1] ва [1, 2] бо тарафҳои рости 7 ва 4 муодилаҳои 3x + y = 7 ва x + 2y = 4-ро медиҳанд. linalg.solve(A, b) вектори ҳалро бармегардонад.

Дар дохил ҳалкунандаи умумӣ одатан матритсаро бо интихоби элементҳои асосӣ таҷзия карда, баъд системаҳои секунҷаи содатарро ҳал мекунад. Он ҷавобҳои имконпазирро пайдарпай намесанҷад. Барои санҷиш боқимондаи A @ answer - b фоиданок аст: он нишон медиҳад, ки гузоштани ададҳои ёфташуда то чӣ андоза муодилаҳоро вайрон мекунад.

import numpy as np
from scipy import linalg

A = np.array([[3., 1.], [1., 2.]])
b = np.array([7., 4.])
answer = linalg.solve(A, b)
print(answer.round(6).tolist())
print(bool(np.allclose(A @ answer, b)))
print(round(float(np.max(np.abs(A @ answer - b))), 10))

Натиҷа:

[2.0, 1.0]
True
0.0

5. Муайянкунанда ва матритсаи баръакс

det(A) муайянкунанда аст: барои матритсаи квадратӣ муайянкунандаи сифрӣ маънои набудани ҳалли ягонаро дорад. inv(A) матритсаи баръаксро медиҳад, агар он вуҷуд дошта бошад. Барои ҳалли система solve(A, b) беҳтар аст: сохтани ошкори матритсаи баръакс кори иловагӣ талаб карда, метавонад хатои ададӣ илова кунад.

Агар сатрҳо вобаста бошанд, матритса сингулярӣ аст: система метавонад ҳал надошта бошад ё беохир ҳал дошта бошад. Дар ин ҳолат solve-и умумӣ LinAlgError медиҳад. Ҳатто муайянкунандаи ғайрисифрӣ устувориро кафолат намедиҳад: дар системаи бадшарт хатоҳои хурди додаҳои воридӣ метавонанд ҷавобро хеле тағйир диҳанд.

from scipy import linalg

A = [[3, 1], [1, 2]]
print(round(linalg.det(A), 6))
print(linalg.inv(A).round(6).tolist())
try:
    linalg.solve([[1, 2], [2, 4]], [3, 6])
except linalg.LinAlgError as error:
    print(type(error).__name__)

Натиҷа:

5.0
[[0.4, -0.2], [-0.2, 0.6]]
LinAlgError

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

  1. interp1d([0, 0, 1], [2, 3, 4]) дар як координата ду баландии гуногун мегирад; натиҷа дуруст муайян нест. Ислоҳ: аввал тарзи якҷоя кардани ченкуниҳои такрориро муайян карда, координатаҳои нодирро диҳед.
  2. Иваз кардани kind="linear" ба "nearest" ба ҷойи қиматҳои мобайнӣ зинаҳо медиҳад. Ислоҳ: усули талабшударо нигоҳ доред; дар мисоли боло барои координатаи 1 ҷавобҳои 6 ва 4 фарқ мекунанд.
  3. Интизори рафтори яксони interp1d ва np.interp берун аз соҳа шудан ба хатои ногаҳонӣ ё қимати доимӣ меорад. Ислоҳ: сиёсати сарҳадҳоро ошкоро интихоб карда, бо як дархости алоҳида санҷед.
  4. Барои суръат истифода бурдани cs(t, 2) шитобро медиҳад. Ислоҳ: ҳосилаи якум cs(t, 1) аст. Дар мисоли хати рост суръат 3 ва ҳосилаи дуюм 0 аст.
  5. Тақсими b[i] / A[i][i] номаълумҳои дигарро сарфи назар карда, одатан системаро ҳал намекунад. Ислоҳ: тамоми матритсаро ба linalg.solve дода, бо гузоштан санҷед. A-ро транспонир накунед: ин коэффитсиентҳоро ба системаи дигар мегузаронад.

Ёддошт

Вазифа Восита
Хати шикаста аз нуқтаҳо interp1d(x, y, kind="linear")
Ҳисоби кӯтоҳи хаттӣ np.interp(t, x, y)
Каҷхати ҳамвор CubicSpline(x, y, bc_type=...)
Қимат ва ҳосилаи сплайн cs(t), cs(t, 1)
Системаи хаттӣ linalg.solve(A, b)
Муайянкунанда ва матритсаи баръакс linalg.det(A), linalg.inv(A)

Ҳангоми интерполятсия координатаҳо, модели интихобшуда ва соҳаи дархостҳоро санҷед. Ҳангоми ҳалли система шакли матритса ва вектор, тартиби номаълумҳо ва боқимондаро баъди ҳисоб санҷед.