Учебный сайт

Бредихина Данилы

  • VII
  • Ряд Фурье функции электронной плотности

Задание функции

Модель для компьютерного эксперимента: две молекулы (всего 5 атомов) расположены на расстоянии ~5 Å на отрезке [0, 30]. Электронные плотности атомов описываются гауссовой кривой. Функция электронной плотности атомов на этом отрезке была задана с помощью скрипта compile-func.py:

python compile-func.py -g 2,3.5,3.1+32,3,4.2+8,3,5.3+24,3,10.1+34,3,11.5

Выходной файл скрипта compile-func.py - текстовый файл func.txt, в котором описана заданная функция (в виде пар X – Y). Скрипт также позволяет получить изображение заданной совокупности гауссовых функций:

Рис. 1: график заданной функции

Полные наборы гармоник

Расчёт коэффициентов Фурье

Коэффициенты разложения функции в ряд Фурье были получены с помощью скрипта func2fourier.py:

python func2fourier.py -i func.txt

Выходной файл скрипта func2fourier.py – текстовый файл func_ft.txt. В нём приведены амплитуды и фазы гармоник, а также их номера.

Отбор гармоник и восстановление функций

Из 499 гармоник были отбирались гармоники, с тем чтобы найти n0, для которого по графику восстановленной по полному набору гармоник (0, 1, ..., n0) функции можно было определить положение максимумов всех гауссовых слагаемых («отличное восстановление»):

python fourier-filter.py -r 0-20 -i func_ft.txt -o func_ft_0-20.txt
python fourier2func.py -f func.txt -i func_ft_0-20.txt -o two_func_0-20.txt

python fourier-filter.py -r 0-30 -i func_ft.txt -o func_ft_0-30.txt
python fourier2func.py -f func.txt -i func_ft_0-30.txt -o two_func_0-30.txt

python fourier-filter.py -r 0-35 -i func_ft.txt -o func_ft_0-35.txt
python fourier2func.py -f func.txt -i func_ft_0-35.txt -o two_func_0-35.txt
# Флаг -s для fourier2func.py позволяет скрыть исходную функцию

Значение n0 было определено равным 35. Ниже приведены графики восстановленных функций по полным наборам гармоник для n, равных 20, 30 и n0 = 35 (результат документирован в таблице 1):

Сравнение восстановленной функции с исходной

↑ Восстановление для n = 20 можно оценить как «среднее»: положение лишь некоторых атомов можно определить по восстановленной функции. Для n = 30 по восстановленной функции можно угадать положение всех максимумов, зная число слагаемых, однако на восстановленной функции максимумы некоторых «атомов» плохо отличимы от шума («хорошее восстановление»). По графику функции, восстановленной по полному набору гармоник 0, 1, ..., 35 можно определить положение максимума всех гауссовых слагаемых функции («отличное восстановление»).

Использование бо́льших значений n для полных наборов гармоник позволяет ещё более точно восстановить исходную функцию:

Добавление шума

Затем к амплитудам и фазам был добавлен шум (20% к амплитуде; 20% к фазе; по 10% к амплитуде и фазе):

# Добавление шума только к амплитуде
python func2fourier.py -F 20 -i func.txt -o ft_noise20-0.txt
python fourier-filter.py -r 0-35 -i ft_noise20-0.txt -o ft_noise20-0_n0.txt
python fourier2func.py -i ft_noise20-0_n0.txt -o two_func_noise20-0_n0.txt
# Добавление шума только к фазе
python func2fourier.py -P 20 -i func.txt -o ft_noise0-20.txt
python fourier-filter.py -r 0-35 -i ft_noise0-20.txt -o ft_noise0-20_n0.txt
python fourier2func.py -i ft_noise0-20_n0.txt -o two_func_noise0-20_n0.txt
# Добавление шума к амплитуде и к фазе
python func2fourier.py -F 10 -P 10 -i func.txt -o ft_noise10-10.txt
python fourier-filter.py -r 0-35 -i ft_noise10-10.txt -o ft_noise10-10_n0.txt
python fourier2func.py -i ft_noise10-10_n0.txt -o two_func_noise10-10_n0.txt

Восстановление функции производилось по полному набору гармоник 0, 1, ..., n0. Качество восстановления заметно снизилось (можно охарактеризовать его как «среднее»), что отражено на изображениях ниже (а также зафиксировано в таблице 1):

Оценка качества восстановления

↑ Как видно, при выбранных значениях шума (как для амплитуды, так и для фазы) становится невозможным восстановление всех положений максимумов гауссовых функций. Для более низких значений шума (по 5% к амплитуде и фазе) положения максимумов угадываются («хорошее восстановление»):

Неполные наборы гармоник

Удаление начальных гармоник

Для получения неполного набора гармоник были удалены одна и две начальные гармоники (гармоника с номером 0; гармоники с номерами 0 и 1):

# Удаление первой гармоники
python fourier-filter.py -r 1-35 -i func_ft.txt -o ft_1-35.txt
python fourier2func.py -i ft_1-35.txt -o two_func_1-35.txt
# Удаление первых двух гармоник
python fourier-filter.py -r 2-35 -i func_ft.txt -o ft_2-35.txt
python fourier2func.py -i ft_2-35.txt -o two_func_2-35.txt

В случае удаления первой гармоники при последующем восстановлении функции видно, что она смещена по оси ординат; при этом результат восстановления можно считать «отличным». Это ожидаемый результат, так как значение первой гармоники равно числу F0 – первому коэффициенту ряда Фурье.
В результате удаления первых двух гармоник восстановленная функция заметно искажается, однако значения максимумов можно однозначно определить.

Удаление гармоник из середины набора

Для получения неполного набора гармоник без ~10% гармоник в его середине были удалены гармоники с номерами 16 - 18, гармоники с номерами 15 - 19):

# Удаление 8% гармоник в середине набора
python fourier-filter.py -r 0-15,19-35 -i func_ft.txt \
                                       -o ft_0-15_19-35.txt
python fourier2func.py -i ft_0-15_19-35.txt \
                       -o two_func_0-15_19-35.txt

# Удаление 14% гармоник в середине набора
python fourier-filter.py -r 0-11,15-17,20-35 -i func_ft.txt \
                                             -o ft_0-11_15-17_20-35.txt
python fourier2func.py -i ft_0-11_15-17_20-35.txt \
                       -o two_func_0-11_15-17_20-35.txt

Удаление как 14%, так и 8% гармоник в середине набора привело к заметному ухудшению качества восстановления (его можно охарактеризовать как «среднее»). Таким образом, вследствие удаления гармоник в середине набора максимумы от «атомов» становятся менее отличимы от шума:

Добавление гармоники n0+10

К набору гармоник 0, 1, ..., 35 была добавлена гармоника 45:

python fourier-filter.py -r 0-35,45 -i func_ft.txt -o ft_0-35_45.txt
python fourier2func.py -i ft_0-35_45.txt -o two_func_0-35_45.txt

Добавление гармоники с номером n0+10 к набору гармоник 0, 1, ..., n0, насколько можно судить по изображению восстановленной функции, не изменила качество восстановления. При сравнении с функцией, восстановленной по набору гармоник 0, 1, ..., n0, удаётся обнаружить лишь незначительные изменения:

Определение разрешения и полноты данных

Для полного набора гармоник разрешение определяется как период гармоники с наибольшим номером. Тогда, например, разрешение для полного набора гармоник 0, 1, ..., 35 равно 30 Å / 35 ≈ 0,86 Å (в данном компьютерном эксперименте). Полнота данных вычисляется как процент гармоник в наборе, период которых не меньше разрешения, от числа гармоник в полном наборе для этого разрешения. Для полного набора полнота данных равна 100%.

Для неполного набора гармоник разумно всегда указывать, помимо разрешения, полноту данных. Так, для набора гармоник 0, 1, ..., 35, 45 разрешение можно определить равным ~0,66 Å при полноте данных 80%. Однако более «справедливым» выглядит разрешение ~0,86 Å при полноте данных 100%. Таким образом, при указании разрешения для неполного набора гармоник видится разумным использование некоего условного порога на полноту данных (например, в 90%).

Таблица 1. Восстановление функции по коэффициентам ряда Фурье
Набор гармоник Разрешение, Å Полнота данных, % Шум амплитуды (% от F) Шум фазы (% от phi) Качество восстановления
Полный набор гармоник
0-20 1,5 100 0 0 Среднее
0-30 1 100 0 0 Хорошее
0-35 0,86 100 0 0 Отличное
0-35 0,86 100 20 0 Среднее
0-35 0,86 100 0 20 Среднее
0-35 0,86 100 10 10 Среднее
0-35 0,86 100 5 5 Хорошее
Неполный набор гармоник
1-35 0,86 97,2 0 0 Отличное
2-35 0,86 94,4 0 0 Отличное
0-15, 19-35 0,86 91,7 0 0 Среднее
0-11, 15-17, 20-35 0,86 86,1 0 0 Среднее
0-35, 45 0,86 100 0 0 Отличное

Файлы

1
2
3
4
5