Модель эксперимента: 5 атомов, расположенных на расстоянии ~5 Å на отрезке [0, 30]. Электронные плотности атомов описываются гауссовой кривой. Функция электронной плотности атомов на этом отрезке была задана с помощью скрипта compile-func.py:
python compile-func.py -g 30,3,3+40,3,4.3+2,3.5,6.5+20,3,7.5+25,4.1,5.6 |
Выходной файл скрипта compile-func.py - текстовый файл func.txt, в котором описана заданная функция (в виде пар X – Y). Скрипт также позволяет получить изображение заданной совокупности гауссовых функций (рис. 1).
Рисунок 1.  График заданной функции - совокурность гауссовых функций. |
Расчёт коэффициентов Фурье
Коэффициенты разложения функции в ряд Фурье были получены с помощью скрипта func2fourier.py:
python func2fourier.py -i func.txt -o func_ft.txt |
Выходной файл скрипта func2fourier.py – текстовый файл func_ft.txt. В нём приведены амплитуды и фазы гармоник, а также их номера.
Отбор гармоник и восстановление функций
Из 499 гармоник были отбирались гармоники от 0 до 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-40 -i func_ft.txt -o func_ft_0-40.txt |
python fourier2func.py -f func.txt -i func_ft_0-40.txt -o two_func_0-40.txt |
Значение n0 было определено равным 40. Ниже приведены графики (рис. 2-4)восстановленных функций по полным наборам гармоник для n, равных 20, 30 и n0 = 40 (результат занесен в таблицу 1).
Восстановление для n = 20 можно оценить как «среднее», так как положение не всех атомов можно определить по восстановленной функции. Для n = 30 по восстановленной функции можно угадать положение всех максимумов, но некоторые максимумы плохо отличимы от шума («хорошее восстановление»). При n = 40 уже возможно определить положение всех гауссовых слагаемых функции («отличное восстановление»).
Добавление шума
Затем к амплитудам (F) и фазам (P) был добавлен шум (20% к амплитуде; 20% к фазе; по 10% и 20% к амплитуде и фазе):
Команды для добавления шума только к амплитуде: |
python func2fourier.py -F 20 -i func.txt -o ft_noise20-0.txt |
python fourier-filter.py -r 0-40 -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-40 -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 |
Команды для добавления шума к амплитуде и фазе (10%): |
python func2fourier.py -F 10 -P 10 -i func.txt -o ft_noise10-10.txt |
python fourier-filter.py -r 0-40 -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 |
Команды для добавления шума к амплитуде и фазе (20%): |
python func2fourier.py -F 20 -P 20 -i func.txt -o ft_noise20-20.txt |
python fourier-filter.py -r 0-40 -i ft_noise20-20.txt -o ft_noise20-20_n0.txt |
python fourier2func.py -i ft_noise20-20_n0.txt -o two_func_noise20-20_n0.txt |
Восстановление функции производилось по полному набору гармоник 0, 1, ..., n0. Качество восстановления заметно снизилось (можно охарактеризовать его как «среднее»), что видно на изображениях (рис. 5-8) и занесено в таблицу 1). Однако везде присутствуют пять пиков, соответствующие тяжелым атомам, поэтому данные восстановления нельзя назвать «плохими».
Удаление начальных гармоник
Для получения неполного набора гармоник были удалены одна и две начальные гармоники (гармоника с номером 0; гармоники с номерами 0 и 1). В случае удаления первой гармоники (рис. 9) восстановленная функция смещается по оси ординат, однако результат восстановления можно считать «отличным», так как значение первой гармоники равно числу F0 – первому коэффициенту ряда Фурье. В результате удаления первых двух гармоник (рис. 10) восстановленная функция сильно искажается, но значения максимумов четко видны.
Команды для удаления первой гармоники: |
python fourier-filter.py -r 1-40 -i func_ft.txt -o ft_1-40.txt |
python fourier2func.py -i ft_1-40.txt -o two_func_1-40.txt |
Команды для удаления первых двух гармоник: |
python fourier-filter.py -r 2-40 -i func_ft.txt -o ft_2-40.txt |
python fourier2func.py -i ft_2-40.txt -o two_func_2-40.txt |
Удаление гармоник из середины набора
Для получения неполного набора гармоник c помощью fourier-filter.py были удалены некоторые гармоники. Удаление как 8% (рис. 11), так и 12% (рис. 12) гармоник в середине набора привело к заметному ухудшению качества восстановления (его можно охарактеризовать как «среднее»). Следовательно, при удалении гармоник в середине набора максимумы от «атомов» становятся менее отличимы от шума.
Команды для удаления 8% гармоник в середине набора: |
python fourier-filter.py -r 0-20,24-40 -i func_ft.txt -o ft_0-20_24-40.txt |
python fourier2func.py -i ft_0-20_24-40.txt -o two_func_0-20_24-40.txt |
Команды для удаления 12% гармоник в середине набора: |
python fourier-filter.py -r 0-10,14-17,20-40 -i func_ft.txt -o ft_0-10_14-17_20-40.txt |
python fourier2func.py -i ft_0-10_14-17_20-40.txt -o two_func_0-10_14-17_20-40.txt |
Добавление гармоники n0+10
К набору гармоник 0, 1, ..., 40 была добавлена гармоника 50:
python fourier-filter.py -r 0-40,50 -i func_ft.txt -o ft_0-40_50.txt |
python fourier2func.py -i ft_0-40_50.txt -o two_func_0-40_50.txt |
Добавление гармоники с номером n0+10 к набору гармоник 0, 1, ..., n0 практически не изменило качество восстановления.
Рисунок 13.  График восстановленной функции с гармониками 0-40 и 50 (сплошная линия - исходная функция, пунктир - восстановленная). |
Определение разрешения и полноты данных
Для полного набора гармоник разрешение - это период гармоники с наибольшим номером. Для набора гармоник 0-40 разрешение равно 30 Å / 40 ≈ 0,75 Å. Полнота данных определяется как процент гармоник в наборе, период которых не меньше разрешения от числа гармоник в полном наборе для этого разрешения. Для полного набора полнота данных равна 100%.
Таблица 1.  Восстановление функции по коэффициентам ряда Фурье
Набор гармоник | Разрешение, Å | Полнота данных, % | Шум амплитуды (% от F) | Шум фазы (% от phi) | Качество восстановления | Полный набор гармоник |
0-20 | 1.5 | 100 | 0 | 0 | Среднее |
0-30 | 1 | 100 | 0 | 0 | Хорошее |
0-40 | 0.75 | 100 | 0 | 0 | Отличное |
0-40 | 0.75 | 100 | 20 | 0 | Среднее |
0-40 | 0.75 | 100 | 0 | 20 | Среднее |
0-40 | 0.75 | 100 | 10 | 10 | Среднее |
0-40 | 0.75 | 100 | 20 | 20 | Среднее |
Неполный набор гармоник | |||||
1-40 | 0.75 | 97.5 | 0 | 0 | Отличное |
2-40 | 0.75 | 95 | 0 | 0 | Отличное |
0-20, 24-40 | 0.75 | 92.5 | 0 | 0 | Среднее |
0-10, 14-17, 20-40 | 0.75 | 87.5 | 0 | 0 | Среднее |
0-40, 50 | 0.75 | 100 | 0 | 0 | Отличное |