Модель: 2 молекулы (всего 5 атомов) расположены на расстоянии около 5 Å на отрезке [0, 30], электронные плотности атомов описываются гауссовой кривой.
Функция электронной плотности атомов на этом отрезке была задана с помощью скрипта compile-func.py
Команда на ввод: python compile-func.py -g 30,3,3+40,3,4.3+2,3.5,6.5+30,3,7.5. Функция задается в виде 5 гауссовских функций, где первое число в каждом слагаемом отображает величину пика, второе - ширину пика, а третье - точку максимума пика.
На выходе скипт выдал файл func.txt с описанием заданной функции (пары Х-У) и изображение заданной функции
Коэффициенты Фурье рассчитываются с помощью скрипта func2fourier.py, принимающий на вход выходной файл предыдущего скрипта.
Команда на ввод: python func2fourier.py -i func.txt.
На выходе получен файл func_ft.txt со знаениями амплитудам и фаз 499 гармоник (отсчет начинается от нуля).
Теперь нужно отобрать гармоники без шума, ведь их количество влияет на на качество восстановления функции электронной плотности. Использовались скрипты fourier-filter.py и fourier2func.py; команды к ним (20 -число гармоник):
python fourier-filter.py -r 0-20 -i func_ft.txt -o func_ft_0-20.txt
python fourier-filter.py -r 0-20 -i func_ft.txt -o func_ft_0-20.txt
Выдача: func_ft_0-20.txt
python fourier-filter.py -r 0-30 -i func_ft.txt -o func_ft_0-30.txt
python fourier-filter.py -r 0-30 -i func_ft.txt -o func_ft_0-30.txt
Выдача: func_ft_0-30.txt
python fourier-filter.py -r 0-35 -i func_ft.txt -o func_ft_0-35.txt
python fourier-filter.py -r 0-35 -i func_ft.txt -o func_ft_0-35.txt
Выдача: func_ft_0-35.txt
Видно, что восстановленная функция (обозначена на графике пунктирной линией) хорошо определяется при 35 гармониках и совпадает с исходной функцией (сплошная линия). При 20 гармониках положения максимумов совпадают не для всех атомов (среднее качество восстановления), при 30 гармониках угадываются все максимумы, но некоторые неотличимы от шума.
А если взять 60 гармоник?
Выдача: func_ft_0-60.txt
Полное совпадение, дальше повышать число гармоник нет смысла.
В дальнейшем для восстановления функции я использовал число гармоник = 35
Использовались следующие команды:
python func2fourier.py -F 10 -i func.txt -o ft_noise10-0.txt
python furier-filter.py -r 0-35 -i ft_noise10-0.txt -o ft_noise10-0_n0.txt
python fourier2func.py -i ft_noise10-0_n0.txt -o two_func_noise10-0_n0.txt
Значения амплитуды и фазы -F (0,10,20) и -P (0,10,20) варьировались, ниже представлены восстановленные функции:
Видно, что добавление шума к фазе сильнее ухудшает восстановление, чем добавление шума к амплитуде. Тем не менее везде видны четыре пика, соответствующие тяжелым атомам, поэтому плохими эти восстановления не назовешь.
Не всегда есть возможность получить полный набор гармоник в ходе эксперимента.
Видно, что восстановленная функция заметно искажается, но значения максимумов остаются на месте
В обоих случаях удаления качество восстановления становится значительно хуже, а некоторые пики вообще становятся практически неотличимы от шума.
А если добавить лишнюю гармонику (например, 35 + 10)?
Видно, что добавление гармоники 45 не изменило качество восстановления функции электронной плотности.
Для полного набора гармоник разрешение - период гармоники с наибольшим номером. Для набора гармоника 0-35 разрешение равно 30 Å / 35 = 0,86 Å. Полнота данных - процент гармоник в наборе, период которых не меньше разрешения от числа гармоник в полном наборе для этого разрешения. Для полного набора полнота данных равна 100%.
© Борисов Евгений 2018