Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

теория 1к 2с / Приближение функций. Методы интерполяции зависимостей с одной независимой переменной. Интерполяционный многочлен Лагранжа. Аппроксимация методом наименьших квадратов

.pdf
Скачиваний:
11
Добавлен:
20.06.2023
Размер:
766.12 Кб
Скачать

Численные методы

Интерполяция и аппроксимация

Интерполяция

Интерполяция - в вычислительной математике

нахождение неизвестных промежуточных значений некоторой функции, по имеющемуся дискретному набору её известных значений, определенным способом.

Методы интерполяции

Интерполяция методом ближайшего соседа

Линейная интерполяция

Интерполяция многочленом Лагранжа

Интерполяция сплайн-функциями и др.

Подготовка

Все дальнейшие примеры кода подразумевают, что модуль MatPlotLib и модуль NumPy импортированы следующим образом:

1 import numpy as np

2 import matplotlib.pyplot as plt

Интерполяция в SciPy

 

Исходный код

Результат

1

from scipy.interpolate import interp1d

 

2

 

 

3

xs = np.linspace(0, 2*np.pi, 1000)

 

4

ys = np.sin(xs)

 

5

 

 

6

x = np.linspace(0, 2*np.pi, 10)

 

7

y = np.sin(x)

 

8

 

 

9

fl = interp1d(x, y, kind="linear")

 

10

fq = interp1d(x, y, kind="quadratic")

 

11

fc = interp1d(x, y, kind="cubic")

 

12

 

 

13

plt.plot(xs, ys, label="Действительное")

 

14

plt.plot(x, y, "o", label="Дискретное")

 

15

plt.plot(xs, fl(xs), ls="-", label="Линейная")

 

16

plt.plot(xs, fq(xs), ls="-.", label="Квадратичная")

 

17

plt.plot(xs, fc(xs), ls=":", label="Кубическая")

 

18

 

 

19plt.legend()

20plt.show()

Интерполяция многочленом Лагранжа

Используйте данный метод только для интерполяции высоко согласованных табличных данных, где может потребоваться

незначительный выход за граничные значения

Математическое выражение

Многочлен Лагранжа

Исходный код

Результат

1 def lagrange(x, xs, ys):

2s = 0

3n = len(xs)

4for i in range(n):

5p = 1

6for j in range(n):

7

if i == j: continue

8

p *= (x - xs[j]) / (xs[i] - xs[j])

9

s += ys[i] * p

10

return s

11

 

12

xs = np.linspace(0, 2*np.pi, 1000)

13

ys = np.sin(xs)

14

 

15

x = np.linspace(0, 2*np.pi, 10)

16

y = np.sin(x)

17

yl = [lagrange(x_, x, y) for x_ in xs]

18

19

 

20

plt.plot(xs, ys, label="Действительное")

21

plt.plot(x, y, "o", label="Дискретное")

22

plt.plot(xs, yl, ls=":", c="r", label="Лагранж")

23

 

24plt.legend()

25plt.show()

Многочлен Лагранжа

С использованием SciPy

 

Исходный код

Результат

1

from scipy.interpolate import lagrange

 

2

 

 

3

xs = np.linspace(0, 2*np.pi, 1000)

 

4

ys = np.sin(xs)

 

5

 

 

6

x = np.linspace(0, 2*np.pi, 10)

 

7

y = np.sin(x)

 

8

 

 

9

L = lagrange(x, y)

 

10

 

 

11

plt.plot(xs, ys, label="Действительное")

 

12

plt.plot(x, y, "o", label="Дискретное")

 

13

plt.plot(xs, L(xs), ls=":",

 

14

c="r", label="Лагранж")

 

15

 

 

16plt.legend()

17plt.show()