Введение
Александр Теофил Вандермонд (28 февраля 1735 - 1 января 1796) - французский музыкант и математик, известный благодаря своей работе в области высшей алгебры.
Главным увлечением Вандермонда длительное время была лишь музыка, но к 35-ти годам юный ученый обратился к математике. Первым делом он провел исследование симметрических функций и решения круговых полиномов, после чего выпустил три статьи: про задачу о ходе коня, про комбинаторику и про основы теории детерминантов.
В честь Александра Теофила был назван специальный класс матриц - матрицы Вандермонда, о котором пойдет речь в данной статье. [1]
Матрица Вандермонда
В линейной алгебре матрица Вандермонда, представляет собой матрицу с членами геометрической прогрессии в каждой строке.
Давайте рассмотрим узлы , где для
Тогда первый столбец матрицы будет полностью заполнен , оно же ; второй столбец будет заполнен , третий - и так далее. Общий вид матрицы:
Применение - интерполяция
Задача интерполяции заключается в том, чтобы найти полином вида:
который удовлетворяет условию:
Сделать это можно используя матрицу Вандермонда, следуя формуле:
где - матрица Вандермонда, - вектор коэффициентов и - вектор значений. [2]
Пример
Даны три точки: , нужно найти полином вида
, проходящий через эти точки.
Для начала, построим матрицу Вандермонда.
Далее, расширим матрицу значениями вектора
Пользуясь правилами сложения и вычитания строк матрицы, упростим её до формы:
Далее, решаем систему методом подстановки,
Таким образом, наш полином равен
Код
Мы создадим собственную функцию vandermonde_matrix,
которая вычисляет матрицу
Вандермонда с узлами, где для .
Входные данные функции — степень искомого полинома, а выходные данные — матрица.
import numpy as np
def vandermonde_matrix(n):
A=np.zeros((n+1,n+1))
for i in range (n+1):
for j in range (n+1):
A[i][j]=(i/n)**j if n !=0 else 1
return A
print(vandermonde_matrix(3)) #пример
Число обусловленности
В численном анализе число обусловленности функции показывает насколько может измениться значение функции при небольшом изменении аргумента. Число обусловленности отражает, насколько чувствительна функция к изменениям или ошибкам на входе и насколько ошибка на выходе является результатом ошибки на входе. [3]
Число обусловленности для матрицы Вандермонда будет рассчитываться как произведение двух норм - нормы матрицы Вандермонда и нормы обратной матрицы Вандермонда.
Код
Для мы построим матрицу Вандермонда
вычислим число обусловленности матрицы и построим график зависимости числа обусловленности матрицы Вандермонда от .
import numpy as np
import matplotlib.pyplot as plt
def vandermonde_matrix(n):
A=np.zeros((n+1,n+1))
for i in range (n+1):
for j in range (n+1):
A[i][j]=(i/n)**j if n !=0 else 1
return A
cond_vandermonde=np.zeros(101)
for i in range (1, 101):
matrix=vandermonde_matrix(i)
matrix_inv=np.linalg.inv(matrix)
cond_vandermonde[i]=np.array(np.linalg.norm(matrix)*np.linalg.norm(matrix_inv))
n_values=np.zeros(101)
for i in range(1, 101):
n_values[i]=np.array(i)
plt.semilogy(n_values, cond_vandermonde)
plt.ylabel('n')
plt.xlabel('Число Обусловленности')
plt.title('Зависимость числа обусловленности от n')
plt.show()
Мы можем заметить, что когда увеличивается размер матрицы, число обусловленности также возрастает. Это связано с тем, что матрица Вандермонда содержит всё большие и большие разности элементов, что приводит к увеличению значений определителя.
Из-за того, что определитель матрицы Вандермонда может сильно возрастать с увеличением размера матрицы, происходят численные нестабильности и потери точности вычислений. Благодаря чему мы можем подвести итог.
Заключение
Метод интерполяции с использованием матрицы Вандермонда эффективен для небольшого количества точек, когда нужно построить матрицу небольшого размера. Однако, для больших данных или случаев с высокой чувствительностью к точности, могут потребоваться более устойчивые методы.
wataru
Вас не смущает график числа обусловленности? Странное поведение: линейный рост, а потом какие-то колебания. Выглядят, как ошибка в вычисленях. Возможно, вызванная переполнением переменных.
Заодно, могли бы вы объяснить что вот этот вот код в питоне делает?
kristina_ponomareva Автор
Здравствуйте!
Нет, не смущает. Колебания вызваны свойствами матрицы Вандермонда, которая часто плохо обусловлена, особенно при больших размерах матрицы. Это приводит к резкому увеличению числа обусловленности и его колебаниям!) ошибок в вычислениях нет.
Что касается вопроса про код, эта строка берет число
i,
преобразует его в формат массива и добавляется в списокn_values
. Сейчас, когда вы написали этот комментарий, я поняла, что можно было не делать черезarray
. Но ошибки нет:)Спасибо за Ваш комментарий!
wataru
Попробуйте поменять тип данных в матрице на np.float32 (по умолчанию там float64). Посмотрите, что произойдет с вашим графиком. Он станет колебаться раньше.
У вас переполнение. Точности вещественных числел тупо не хватает для вычисления обратной матрицы.
Попробуйте использовать пакет sympy. Или какой-нибудь Pygmp, правда обращение матрицы придется писать руками методом Гаусса, да и вычисление нормы тоже.
Погуглите свойства этой самой матрицы. Уверен, для числа обусловленности есть какая-нибудь аж замкнутая формула.
vadimr
Так ясен пень, что если i делить на 10**17, то результат незначим.
kristina_ponomareva Автор
Есть методы интерполяции которые работают всегда, а есть которые нет) про это и рассказываю
vadimr
"Всегда" в вещественной арифметике не бывает.
kristina_ponomareva Автор
Это да